====== Třída představující okno s jedním tlačítkem ======
Vytvoříme třídu Window.
import sys
from PyQt5.QtWidgets import *
class Window (QMainWindow) :
def __init__ (self) :
super().__init__()
button = QPushButton (self)
button.setText ("Knoflik")
self.setCentralWidget (button)
def main () :
app = QApplication (sys.argv)
win = Window ()
win.show ()
sys.exit (app.exec_())
if __name__ == "__main__" :
main ()
V Linuxu použijeme nějaký editor, uložíme zdrojový text do soubory např. //pokus.py// a spustíme **python3 pokus.py**. \\
Ve Windows můžeme použít jednoduché prostředí IDLE nainstalované spolu s Pythonem, v menu //File/New File// a opět v menu //Run//.
Program začíná importem modulu **sys**. \\
Později použijeme **sys.argv** jako pole řádkových parametrů zadaných uživatelem. \\
Následuje import všech symbolů (** * **) z modulu **PyQt5.QtWidgets**. \\
Modul jsme naninstalovali do // Python3.8/lib/site-packages/ // příkazem //pip3 install PyQt5//.
Vytvoříme __třídu__ //Window// __odvozenou__ od třídy //QMainWindow//. \\
Třída obsahuje __metodu__ (v C++ __členskou funkci__, member function) _ _ init _ _. \\
Toto zvláštní jméno představuje konstruktor, tedy metody automaticky volanou při vzniku nové __instance__.
Parameter **self** v metodách představuje odkaz na instanci, pro kterou byla metoda volána. \\
Tento parametr musíme v metodách uvádět.
Je to obdoba **this** z jazyka C++.
Zápis **self.jméno** musíme také používat při přístupu k metodám nebo __atributům__ (proměnným uvnitř třídy, v C++ __členská data__). \\
Skriptovací jazyk jinak nerozezná atribut či metodu od lokálních nebo globálních proměnných.
V konstruktoru nejprve zavoláme konstruktor nadrřazené třídy, z které je naše třída odvozena.
super().__init__()
Potom vytvoříme novou instanci třídy QPushButton a odkaz (v C++ ukazatel) uložíme do lokální proměnné //button//.
button = QPushButton (self)
Konstruktoru nově vznikající instance předáme jako parametr odkaz na naše okno. \\
Pokud konstruktor parametry nemá musíme použít prázdné závorky **( )**.
Potom tlačítku nastavíme nadpis voláním metody //setText//. \\
A oknu nastavíme tlačítko jako centrální prvek.
button.setText ("Knoflik")
self.setCentralWidget (button)
Zadefinujeme novou globální funkci (proceduru) //main//. \\
Identifikátor //main// zde nemá žádný zarezervovaný význam, funkce se může jmenovat libovolně. \\
Funkce nemá žádné parametry, za definicí musí být dvojtečka, tělo funkce musí být //"identováno"// o několik mezer.
def main () :
app = QApplication (sys.argv)
win = Window ()
win.show ()
sys.exit (app.exec_())
Funkce //main// vytvoří instanci třídy //QApplication// která udržuje seznam oken naší aplikace. \\
Potom vytvoříme novou instanci reprezentující naše okno. \\
Okno zobrazíme na obrazovce.
Funkce **app.exec_()** nechá aplikaci běžet a čeká na stisky kláves a pohyby myši. \\
Až aplikace skončí tak je výsledkem metody //exec_// číslo, které sys.exec předá aplikaci, která náš program spustila.
if __name__ == "__main__" :
main ()
Na prvním sloupci zcela vlevo začínají importy, deklarace tříd, globálních funkcí a __hlavní program__. \\
Hlavní program otestuje, zda není spuštěn jen jako modul v jiném programu. \\
A pokud je samostatným programem, tak zavolá funkci //main//.
====== Reakce na stisknutí tlačítka ======
Ještě doplníme funkci volanou při stisknutí tlačítka. \\
Z lokální proměnné //button// uděláme atribut (**self.button**), tedy proměnnou uloženou v instanci naší třídy //Window//. \\
Budeme ji potřebovat v metodě //onClick//.
Až bude tlačítko stisknuto, tak se má zavolat metoda //onClick// z naší třídy //Window//.
self.button.clicked.connect (self.onClick)
Zde je celý program.
import sys
from PyQt5.QtWidgets import *
class Window (QMainWindow) :
def __init__ (self) :
super().__init__()
self.button = QPushButton (self)
self.button.setText ("Knoflik")
self.button.clicked.connect (self.onClick)
self.setCentralWidget (self.button)
def onClick (self) :
self.button.setText ("Click")
def main () :
app = QApplication (sys.argv)
win = Window ()
win.show ()
sys.exit (app.exec_())
if __name__ == "__main__" :
main ()
{{uop::button.png}}