Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
Úvod do Pythonu
Print
Proměnné
Komentáře
Datové typy v Pythonu
Čísla
Text - string
Pole - list
Úvod do PyQt
Importujeme PyQt
Vytváříme okno
Závěr
V této sérii článků bych vás chtěl seznámit s Pythonem a jedním z jeho modulů zvaným PyQt, který umožňuje spojení Qt a Pythonu. Většina distribucí by měla Python i PyQt obsahovat. Pokud je zrovna vaše distribuce neobsahuje, můžete PyQt i Python zdarma stáhnout a nainstalovat podle návodu.
Python je interpretovaný, objektově orientovaný skriptovací jazyk. Má mnoho modulů, které obsahují funkce například pro práci s archivy, práci s emaily nebo pro tvorbu grafického rozhraní (TK, PyQt, WxWidgets...). Cílem seriálu je, aby si i člověk, který v Pythonu ještě neprogramoval, uměl udělat jednoduchý grafický program a pochopil základní principy Pythonu. V tomto díle si probereme základní datové typy Pythonu a řekneme si, jak vytvořit okno.
Pokud máte Python nainstalován, spustíte ho příkazem
python
. Před vámi se objeví jeho interpret, do kterého již
můžete zadávat příkazy. Pokud byste chtěli spustit příkazy přímo z
příkazové řádky, můžete použít parametr -c
Pythonu.
python -c 'print "Hello world"'
Další možností je spustit soubor. Ten spustíte jednoduchým příkazem
python soubor.py
. My v dnešním úvodu budeme používat zatím
pouze první způsob spuštění. Znaky >>>
signalizují
vstup interpretu.
Jak jste si možná již všimli, Python používá pro výstup na obrazovku
příkaz print
. Pokud chcete zobrazit text, musíte jej uzavřít
do jednoduchých nebo dvojitých uvozovek. Takže například print "hello
world"
nebo print 'hello world'
zobrazí text
hello world
.
Proměnnou vytvoříme stejně jako v ostatních jazycích pomocí operátoru
"=". Pokud chcete například uložit do proměnné cislo
číslo 5,
můžete tak udělat kódem cislo=5
. Typ proměnné určuje až její
hodnota. Proto můžeme do jedné proměnné uložit text a následně například
číslo. V C/C++ toto není možné. Vidět to můžete na následujícím
příkladu.
>>> a="text"
>>> print a
text
>>> a=17
>>> print a*5
85
Komentáře v Pythonu můžeme vytvářet pomocí znaku #
. Vše, co
je za ním, je bráno jako komentář. Příklady komentářů můžete vidět v
některých z dalších příkladů.
Čísla můžeme mezi sebou sčítat, odčítat, dělit a násobit stejně jako ve většině jiných jazyků. Myslím, že za vše bude mluvit následující přiklad.
>>> 1+1
2
>>> 121/11
11
>>> 11*11
121
>>> (8+2)*10/10
10
>>> 7/3
1
>>> a=1 # Do promenne "a" ulozime cislo 1
>>> a
1
>>> a+1
2
>>> a*5-6
-1
V následujícím příkladu jsme používali pouze čísla celá. Proto se například u 7/3 automaticky zrušila desetinná místa. Samozřejmě v Pythonu existují i desetinná čísla a při výpočtech s nimi se celá čísla mění na čísla desetinná.
>>> 3.75/5
0.75
>>> 7.0/3
2.3333333333333335
>>> (1.3*5)/3.5
1.8571428571428572
Python podporuje i komplexní a imaginární čísla, ale pro začátek pro nás nejsou užitečná, takže si o nich povíme později.
Text se v Pythonu ohraničuje jednoduchými nebo dvojitými uvozovkami.
Texty můžeme spojovat pomocí operátoru +. Můžeme jednoduše přetypovat číslo
nebo pole na text pomocí funkce str(objekt_k_pretypovani)
. V
textech můžeme používat zaužívané znaky jako je třeba konec řádku ("\n")
nebo obrácené lomítko ("\\"). Při vypisování textu funkcí
print
můžeme vypsat více textových proměnných ještě tak, že je
oddělíme čárkou. V tom případě bude čárka ve výsledku nahrazena mezerou.
Zase uvedu příklad.
>>> print "hello "+'world'
hello world
>>> print str(1+2)
3
>>> print "hello \" WORLD \"", str(2*2)
hello " WORLD " 4
>>> a="hello "+'world'
>>> print "hello world",a
hello world hello world
Text můžeme i opakovat tak, že ho jednoduše vynásobíme :-) (operátor "*").
>>> a="hello world "
>>> print a*3
hello world hello world hello world
Text je v Pythonu indexován podobně jako v C. Lze tedy přistupovat k jednotlivým znakům i částem textu. Nesmíme u indexování zapomenout na to, že první znak textu je indexován jako 0.
>>> a="hello world"
>>> print a[0] # vypise 1. znak textu
h
>>> print a[2:4] # vypise 3. a 4. znak textu
ll
>>> print a[2:-2] # vypise vse od 3. az po 2. znak od konce
textu
llo wor
>>> print a[-2] # vypise 2. znak od konce
l
>>> print a[:-2] # vypise vse az po 2. znak od konce textu
hello wor
>>> print a[2:] # vypise vse od 3. znaku
llo world
>>> print a[-2:] # vypise vse od 2. znaku od konce textu
ld
Práce s poli je podobná jako indexování textů, ale místo znaků můžeme v polích uchovávat celé řetězce nebo čísla. K polím je v Pythonu přidružena celá řada funkcí například pro seřazení pole, nalezení položky v poli atd. O těch bychom si ale pověděli v některém z dalších dílů.
>>> a=["hello","world","ahoj","svete"]
>>> a
['hello', 'world', 'ahoj', 'svete']
>>> a[0]
'hello'
>>> a[:2]
['hello', 'world']
>>> a+["dalsi text"]
['hello', 'world', 'ahoj', 'svete', 'dalsi text']
>>> a
['hello', 'world', 'ahoj', 'svete']
V úvodu do PyQt se naučíme importovat PyQt modul. To znamená, že se načtou všechny funkce PyQt a my je budeme moci používat. Poté si řekneme o funkci pro vytvoření okna a vytvoříme si jednoduché prázdné okno.
Importování PyQt provedeme pomocí příkazu from qt import *
.
Tento řádek importuje vše z modulu qt. Pokud se objevila po zadání tohoto
příkazu chyba, nemáte PyQt správně nainstalován.
Nejprve musíme vytvořit samotný objekt aplikace. To zajistí funkce
QApplication(sys.argv)
. QApplication si žádá parametry z
příkazové řádky. Pro jednoduchost nebudeme používat parametry z příkazové
řádky, ale dáme funkci QApplication() pouze prázdné pole.
app=QApplication([])
Dále musíme vytvořit okno naší aplikace funkcí
QMainWindow()
.
win=QMainWindow()
Okno zobrazíme. Okno se zobrazí pouze v paměti, ale ještě ne na obrazovce.
win.show()
Nyní zajistíme, aby se po uzavření okna zavřela celá aplikace a nestála
dále v paměti. Tento řádek si vysvětlíme až příště, ale zkráceně jde o to,
že když aplikace ("app") řekne (zavolá signál), že jsou všechna okna
uzavřena, tak se aplikace ("app") vypne (quit())
.
app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
Nakonec aplikaci spustíme a okno se zobrazí.
app.exec_loop()
Můžete si přečíst celý záznam z interpreteru.
>>> from qt import *
>>> app=QApplication([])
>>> win=QMainWindow()
>>> win.show()
>>> app.connect(app, SIGNAL("lastWindowClosed()"), app,
SLOT("quit()"))
True
>>> app.exec_loop()
0
Pokud byste dali příkazy, které jste zadávali do interpreteru, do
souboru, můžete ho pak spustit příkazem
python soubor.py
.
V dalším díle si povíme o podmínkách a cyklech, naučíme se do okna vepisovat text a vůbec si o Pythonu a PyQt budeme povídat hlouběji než v dnešním "úvodním" díle.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
Narážel na to, že komentátor v Quake3Arena hlásí: "two frags left, one frag left". Máš to přesně tak napsaný.
Jestli někdo ví, co se řve v QIII, tak jsem to já. Proto to tam mám napsaný.
Ale je to třeba i v Nexuizu.
PS: You are tied for the lead.
Jinak - Python všichni umíme, přejděme k věciPython všichni umíme? O tom ani nevím.
...a taky se nemusí kompilovat (pro to určitě existuje výraz, ale zrovna mě nenapadá)...interpretovaný
... python pyconfig.py >> config.h lwc seg-malloc.c+ > cdir/seg-malloc.c /bin/sh: lwc: command not found make[1]: *** [cdir/seg-malloc.c] Error 127 make[1]: Leaving directory `/home/david/compile/hmmm/toolchain/pyvm' make: *** [all] Error 2a ani s pomocí Google nedám dohromady kde to sakra seženu.
PATH=$PATH:~/bin
a znova make
, je tu ale další chyba...
gcc -c -O3 -Wall -Wno-parentheses cdir/IO.c -o objdir/IO.o cdir/IO.c:28: error: conflicting types for 'malloc' cdir/IO.c:28: error: conflicting types for 'malloc' make[1]: *** [objdir/IO.o] Error 1 make[1]: Leaving directory `/home/david/compile/hmmm/toolchain/pyvm' make: *** [all] Error 2Nějak mi to není přáno... Každopádně tam píšou, že je to otestovaný jen na x86 (asi 32bit) a že pokud to chci kompilovat na jiné architektuře, mám raději počkat na další verze...
>>> import py_compile >>> compile('test.py') Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: compile() takes at least 3 arguments (1 given) >>> compile('test.py, test.pyc') Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: compile() takes at least 3 arguments (1 given):/ podle manuálu by měl stačit jeden argument... Jde mi z toho hlava kolem.
py_compile.compile()
. Viď dokumentácia k modulom.
from py_compile import compile compile('/home/david/devel/python/test.py')Takhle je to lepší.
#! /usr/bin/env python # -*- coding: UTF-8 -*- import sys, py_compile py_compile.compile(sys.argv[1])a pro adresář:
#! /usr/bin/env python # -*- coding: UTF-8 -*- import sys, compileall compileall.compile_dir(sys.argv[1], 1)To jen kdyby to tu někdo hledal.
__init__()
nie je nič iné ako konštruktor.
Nevytvari sice objekt ve smyslu alokace pameti Narozdil od metody __new__(), ze? Neni tedy spis konstruktor toto? A dostavame se opet k tomu, co jsem rikal. Hledat analogii u oop jazyku implementovanych jinak je silne zavadejici a vede k chybnemu chapani, proto je nevhodne.Milý pane, ste trochu vedľa. Konštruktorom sa v OOP (nie len v Jave, C#, ale v OOP všeobecne) chápe funkcia, ktorá inicializuje objekt ako taký, nestará sa o nízkoúrovňové procesy. Vytvorením objektu sa potom chápe jeho vytvorenie v pamäti (new) a inicializácia (init). Ešte raz to zopakujem, jediný rozdiel oproti Jave je syntaktický: v Pythone napíšeme
= Class();
a v Jave = new Class()
, ale v oboch jazykoch vedú tieto výrazy k rovnakému procesu.
A k akému chybnému chápaniu vedie pomenovať funkciu ktorá sa stará o inicializáciu objektu? Jediné chybné chápanie, ktoré som si všimol je vaše, ale pramení zjavne z toho, že neviete, čo to konštruktor je. A to ma dosť zaráža.
Samozrejme, že v čistom OOP existujú len správy, ale Python nie je čistý OOP jazyk.
Konkrétne, pozrite si tento článok. Podstata je, že v staticky typovaných jazykoch exituje len jeden spôsob vytvorenia objektu: volaním konštruktoru, kdežto v čistých OOP stačí poslať triede (ešte nevytvorenému objektu) ľubovoľnú správu a objekt sa vytvorí popritom. AFAIK v pythone niečo takéto nie je možné, ale musí sa najprv objekt vytvoriť a až potom môžeme volať niektorú jeho metódu, i.e.:
ob = Object()
ob.show()
ale nie
ob = Object.show()
a teda v tomto ohľade je pythone takmer rovnaký ako Java, C#. Rovnako sa pritom volá konštruktor (opäť v mojom chápaní) objektu lenže v pythone sa nazýva __init__
a nie Object()
.
def x(a, b): return a+b print x(1, 2)LZE! pokud mam napriklad funkci, ktera jako parametr ocekava funkci, tak tam misto toho muzu klidne soupnout tridu. Oboji jsou to volatelne objekty a je mozne je zamenovat. Vyborne, tak si to predvedeme prakticky, treba se naucim neco noveho:
def cmpfun(a, b): if a>b: return 1 if b>a: return -1 return 0 print [1,5,9,7,5,3].sort(cmpfun)Metoda sort jako parametr ocekava funkci. Predavam funkci cmpfun, prosim o jeji nahrazeni tridou. metoda __new__ je mnohem nizkourovnovejsi nez __init__. je to spis takovej hack. Neni to hack a je na stejne urovni jako init, jen se tak casto neprekryva. Vase teorie zacina dostavat trhliny
########################################## def x(a, b): return a+b print x(1, 2) >>> class x: ... def __init__(self, a, b): ... self.c = a+b ... def __str__(self): ... return str(self.c) ... >>> print x(1, 2) 3 # i kdyz pri jinych prilezitostech by bylo potreba napr. # doplnit metodu __int__ a podobne, # ale o to v OOP v pojeti pythonu jde. muzete objekty # zamenovat. pokud rozumi pozadovanym zpravam... ########################################## >>> def cmpfun(a, b): ... if a>b: return 1 ... if b>a: return -1 ... return 0 ... >>> print [1,5,9,7,5,3].sort(cmpfun) None # predpokladam ze jste si jen neuvedomil, ze metoda sort # pracuje s puvodnim polem a myslel jste toto: # a = [1,5,9,7,5,3] # a.sort(cmpfun) # print a ###################################################### >>> class cmpfun(int): ... def __new__(cls, a = 0, b = 0): ... if a > b: return int.__new__(cls, 1) ... if a < b: return int.__new__(cls, -1) ... return int.__new__(cls, 0) ... >>> a = [1,5,9,7,5,3] >>> a.sort(cmpfun) >>> print a [1, 3, 5, 5, 7, 9] >>> ##########################################################takze sem prave prokazal, ze funkce a tridy jsou zamenitelny.... mam pocit, ze OOP v pythonu (a podobnych jazycich, napr. smalltalk) prilis nerozumite. Nikoho toti nezajima, ze se jedna o uplne jiny objekt, kdyz shodne reaguje na stejne zpravy.... > Neni to hack a je na stejne urovni jako init, jen se tak casto neprekryva. Vase teorie zacina dostavat trhliny
class A { public: int x; }; class B { public: float y; }; void f() { A* a; B* b; *a = *b; // nemozne a = (A*)b; // mozne bez jakekoli kontroly typu. // proste se nastavi ukazatel na adresu // b (obcas se to ale hodi ;)) }
print
vola metodu __str__
jak u puvodniho intu, tak i u myho objektu. takze jsou zamenitelny (v tomhle pripade)
> Stale stojim o vysvetleni toho, proc se domnivate, ze si python pletu se statickymi jazyky, i kdyz uz zacinam tusit, ze jde o nedorozumneni a ze je to kvuli tomu, ze si pod tvrzenim, ze funkce a tridy nejsou zamenitelne predstavujem kazdy neco jineho.
asi jsem se unahlil. byl to jenom takovej dojem. Kdyz sem videl jak se snazite funkce a tridy oddelovat, vzpomel sem si na Javu a kolik ma vzdycky reci QMainWindow()
v pythone neexistuje.
QMainWindow()
v skutočnosti vytvorí nový objekt typu QMainWindow
a odkaz naňho potom odovzdá ako prvý argument funkcii QMainWindow.__init__()
– takže analógiu môžeme vidieť skôr s týmto kódom Javy (C++):win = new QMainWindow();
To len aby sme zatiaľ dali veci na pravú mieru. Určite sa aj k tejto problematike autor neskôr vyjadrí.
Inak fajn článok, držím palec Díky, už asi měsíc se chystám s PyQt začít, ale nebylo dost času. Teď jsem rád, že jsem počkal
python-qt
.
Skvely serial, chtel jsem se ucit PyQt ale zatim jsem se k tomu nejak nedostal az ted . Uz jsem pridal na nej odkaz na PyCZ Wiki.
Jeste se chci zeptat: kolik dilu planujete? Co vsechno hodlate probrat?
Tak kolik dilu to nakonec bude nevim, ale ma idea je takova, ze tak do tretiho dilu bych se chtel u QT dostat k prvkum button, lineEdit, TextLabel. Samozrejme je vysvetleni signalu a slotu trosku do hloubky. V Pythonu se do tretiho dilu vysvetli tvorba vlastnich funkci a snad i trid, textovy vstup, podminky, cykly a mozna zvladnem jeste pokrocilou praci s poli :) Od tretiho dilu bych chtel, aby byla vysledkem kazdeho dilu nejaka pouzitelna aplikace. No a pri tvorbe te aplikace si pak vysvetlime nove prvky, ktere jsme pouzili. Nezavazuju se, ze tohle schema dodrzim , ale pokud to bude mozne, chtel bych, aby bylo takove.
Moc vsem dekuji za podporu . Hodne me potesila reakce na clanek