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 ()

 
python/button.txt · Last modified: 2022/09/26 16:02 by 147.32.8.31
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki