Hlavní navigace

Standardní dialogy v knihovně PySide

Pavel Tišnovský

Dnes se budeme zabývat způsobem použití standardních dialogů, které je možné v aplikacích využít. Jedná se jak o skutečně základní dialogy (zobrazení zprávy, vstup textu), tak i o dialogy komplikovanější.

Doba čtení: 30 minut

Obsah

1. Standardní dialogy v knihovně PySide

2. Dialog pro zobrazení zprávy uživateli

3. První demonstrační příklad: jednoduchý dialog s ikonou a textovou zprávou

4. Dialog určený pro zobrazení chybové zprávy

5. Druhý demonstrační příklad: zobrazení chybové zprávy

6. Jednoduché dialogy pro vstup údajů

7. Vstupní dialog nakonfigurovaný pro zadání běžného textu

8. Třetí demonstrační příklad: dialog pro zadání jednořádkového textu

9. Vstupní dialog nakonfigurovaný pro zadání celého čísla

10. Čtvrtý demonstrační příklad: dialog pro specifikaci celého čísla

11. Vstupní dialog nakonfigurovaný pro zadání reálného čísla

12. Pátý demonstrační příklad: dialog pro specifikaci reálného čísla

13. Dialog s výběrem prvku ze seznamu nebo kombo boxu

14. Šestý demonstrační příklad: výběr prvku z kombo boxu

15. Sedmý demonstrační příklad: výběr prvku ze seznamu

16. Standardní dialog pro výběr barvy z palety

17. Osmý demonstrační příklad: dialog pro výběr barvy

18. Repositář s demonstračními příklady

19. Odkazy na Internetu

1. Standardní dialogy v knihovně PySide

V dnešním článku se seznámíme s dalšími možnostmi nabízenými knihovnou PySide. Podobně, jako je tomu i v dalších frameworcích určených pro tvorbu aplikací s grafickým uživatelským rozhraním, nabízí i knihovna PySide programátorům několik typů standardních dialogů. Tyto dialogy jsou navrženy takovým způsobem, aby svým vzhledem i chováním odpovídaly chování aplikací na dané platformě. Současná verze knihovny PySide nabízí tyto dialogy (jejich třídy jsou odvozeny od obecného dialogu QDialog):

Třída Stručný popis
QMessageBox zobrazení zprávy uživateli
QErrorMessage zobrazení chybové zprávy popř. průběžně se doplňujících informací
   
QInputDialog vyžádání vstupu od uživatele
QColorDialog výběr barvy
QFontDialog výběr fontu
QFileDialog výběr souboru nebo adresáře
   
QAbstractPrintDialog základní implementace dialogu pro konfiguraci tiskáren
QPrintDialog ucelený dialog pro výběr a konfiguraci tiskárny
QAbstractPageSetupDialog základní implementace dialogu pro nastavení tisku dokumentu
QPageSetupDialog nastavení tisku dokumentu
QWizard dialog sestavený ze sekvence „stránek“, které uživatel postupně vyplňuje
QProgressDialog zobrazení průběhu déletrvající operace
QPrintPreviewDialog dialog pro náhled na dokument, který se má vytisknout + pro nastavení tiskových stran atd.

Všechny tyto typy dialogů si postupně popíšeme.

2. Dialog pro zobrazení zprávy uživateli

Nejjednodušším dialogem podporovaným knihovnou PySide je dialog určený pro zobrazení zprávy uživateli. V tomto dialogu je možné kromě vlastní jednořádkové či víceřádkové zprávy specifikovat i ikonu zobrazenou uživateli a popř. upravit počet a význam tlačítek. Podívejme se, jak se tento dialog zobrazí. Není to nic složitého:

def showMessageBox(self):
    msgBox = QtGui.QMessageBox()
    msgBox.setText(u'Zpráva')
    msgBox.exec_()

Obrázek 1: Dialog s ikonou QMessageBox.Information.

Ikonu vkládanou do dialogu je možné nakonfigurovat dvěma způsoby. Buď lze použít metodu setIconPixmap(), které se předá libovolná pixmapa, což je sice řešení flexibilní, ovšem bude složité vybrat takovou ikonu, která zapadne do L&F celého desktopového prostředí. Pokud se jedná o nějakou zprávu se standardním významem, je výhodnější namísto setIconPixmap() zavolat metodu nazvanou setIcon(), které se předá jedna z následujících konstant:

Ikona
QMessageBox.NoIcon
QMessageBox.Question
QMessageBox.Information
QMessageBox.Warning
QMessageBox.Critical

Obrázek 2: Dialog s ikonou QMessageBox.Question.

Vytvoření dialogu tedy může vypadat následovně:

def showMessageBox(self):
    msgBox = QtGui.QMessageBox()
    msgBox.setText(u'Zpráva')
    msgBox.setIcon(QtGui.QMessageBox.Information)
    msgBox.exec_()

Obrázek 3: Dialog s ikonou QMessageBox.Warning.

Dialog lze konfigurovat i dalšími způsoby, například do něj je možné přidávat další tlačítka. S těmito způsoby se seznámíme v závěrečné části tohoto článku.

Obrázek 4: Dialog s ikonou QMessageBox.Critical.

3. První demonstrační příklad: jednoduchý dialog s ikonou a textovou zprávou

V dnešním prvním demonstračním příkladu je ukázán způsob zobrazení jednoduchého dialogu, v němž je umístěna informační ikona a taktéž zpráva. Ta může být jednořádková či víceřádková. Tento dialog zobrazíte po výběru tlačítka „Message Box“, jehož stisk zavolá handler showMessageBox (kód této funkce byl ukázán v předchozí kapitole):

#!/usr/bin/env python
# vim: set fileencoding=utf-8
 
import sys
 
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
 
 
# nový widget bude odvozen od obecného widgetu
class MainWindowContent(QtGui.QWidget):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindowContent, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        quitButton = self.prepareQuitButton()
        messageBoxButton = self.prepareMessageBoxButton()
 
        # vytvoření správce geometrie
        topLayout = QtGui.QVBoxLayout()
 
        # umístění widgetů do okna
        topLayout.addWidget(messageBoxButton)
        topLayout.addWidget(quitButton)
 
        # nastavení správce geometrie a vložení všech komponent do okna
        self.setLayout(topLayout)
 
    def prepareMessageBoxButton(self):
        # tlačítko
        messageBoxButton = QtGui.QPushButton('Message Box', self)
        messageBoxButton.resize(messageBoxButton.sizeHint())
 
        # navázání akce na signál
        messageBoxButton.clicked.connect(self.showMessageBox)
        return messageBoxButton
 
    def prepareQuitButton(self):
        # tlačítko
        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.resize(quitButton.sizeHint())
 
        # navázání akce na signál
        quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        return quitButton
 
    def showMessageBox(self):
        msgBox = QtGui.QMessageBox()
        msgBox.setText(u'Zpráva')
        msgBox.setIcon(QtGui.QMessageBox.Information)
        msgBox.exec_()
 
 
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindow, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        # velikost není potřeba specifikovat
        # self.resize(320, 240)
        self.setWindowTitle("QMessageBox")
 
        # vložení komponenty do okna
        self.setCentralWidget(MainWindowContent())
 
    def run(self, app):
        # zobrazení okna na obrazovce
        self.show()
        # vstup do smyčky událostí (event loop)
        app.exec_()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow().run(app)
 
 
if __name__ == '__main__':
    main()

4. Dialog pro zobrazení chybové zprávy

Druhým typem dialogu, s nímž se v dnešním článku setkáme, je dialog sloužící pro zobrazení chybové zprávy popř. pro doplnění dalších informací o chybě. Tento dialog je reprezentován třídou QErrorMessage, popř. potomky této třídy. Jedním z podstatných rozdílů mezi tímto dialogem a výše popsaným dialogem QMessageBox je fakt, že u chybového dialogu je možné s využitím zobrazeného zatrhávacího tlačítka (checkboxu) zajistit, aby se již podobné typy zpráv uživateli nezobrazovaly. Nejprve se však podívejme na tu nejjednodušší variantu dialogu se zobrazením chybové zprávy. Ten se nakonfiguruje následujícím způsobem:

def showErrorMessage(self):
    msgBox = QtGui.QErrorMessage()
    msgBox.showMessage(u'Chybová zpráva')
    msgBox.exec_()

Obrázek 5: Dialog se zobrazením chybové zprávy a taktéž se zatrhávacím tlačítkem, pomocí něhož lze pozastavit výpis podobných typů zpráv.

5. Druhý demonstrační příklad: zobrazení chybové zprávy

Zobrazení jednoduché chybové zprávy v chybovém dialogu, prozatím ovšem bez naprogramování reakce na nastavení checkboxu uživatelem, je ukázán v dnešním druhém demonstračním příkladu, jehož zdrojový kód je zobrazen pod tímto odstavcem:

#!/usr/bin/env python
# vim: set fileencoding=utf-8
 
import sys
 
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
 
 
# nový widget bude odvozen od obecného widgetu
class MainWindowContent(QtGui.QWidget):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindowContent, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        quitButton = self.prepareQuitButton()
        errorMessageButton = self.prepareErrorMessageButton()
 
        # vytvoření správce geometrie
        topLayout = QtGui.QVBoxLayout()
 
        # umístění widgetů do okna
        topLayout.addWidget(errorMessageButton)
        topLayout.addWidget(quitButton)
 
        # nastavení správce geometrie a vložení všech komponent do okna
        self.setLayout(topLayout)
 
    def prepareErrorMessageButton(self):
        # tlačítko
        errorMessageButton = QtGui.QPushButton('Error Message', self)
        errorMessageButton.resize(errorMessageButton.sizeHint())
 
        # navázání akce na signál
        errorMessageButton.clicked.connect(self.showErrorMessage)
        return errorMessageButton
 
    def prepareQuitButton(self):
        # tlačítko
        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.resize(quitButton.sizeHint())
 
        # navázání akce na signál
        quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        return quitButton
 
    def showErrorMessage(self):
        msgBox = QtGui.QErrorMessage()
        msgBox.showMessage(u'Chybová zpráva')
        msgBox.exec_()
 
 
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindow, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        # velikost není potřeba specifikovat
        # self.resize(320, 240)
        self.setWindowTitle("QErrorMessage")
 
        # vložení komponenty do okna
        self.setCentralWidget(MainWindowContent())
 
    def run(self, app):
        # zobrazení okna na obrazovce
        self.show()
        # vstup do smyčky událostí (event loop)
        app.exec_()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow().run(app)
 
 
if __name__ == '__main__':
    main()

6. Jednoduché dialogy pro vstup údajů

V případě, že budeme od uživatele vyžadovat zadání nějakých údajů popř. výběr prvků z nějakého seznamu, máme k dispozici tři možnosti:

  1. Použít běžné ovládací prvky (widgety) určené pro vstup údajů a zabudovat tyto widgety přímo do oken aplikace. S většinou těchto widgetů jsme se již setkali, další si popíšeme v navazujících částech tohoto seriálu.
  2. Naprogramovat si vlastní vstupní dialogy, ať již modální či nemodální.
  3. Využít standardní typ dialogu představovaný třídouQInputDialog. Možnosti nabízené touto třídou jsou sice na jednu stranu omezené (vždy jen jeden typ vstupu), na stranu druhou je však použití standardních dialogů velmi jednoduché – většinou se jedná o pouhých několik řádků v programu.

V navazujících kapitolách si ukážeme pět různých podob dialogů podporovaných třídou QInputDialog

  • Dialog pro vstup textu
  • Dialog pro vstup celočíselné hodnoty
  • Dialog pro vstup reálné hodnoty
  • Dialog pro výběr prvku s využitím kombo boxu
  • Dialog pro výběr prvku ze seznamu

7. Vstupní dialog nakonfigurovaný pro zadání běžného textu

První typ dialogu, který očekává vstup od uživatele, je dialog určený pro zápis běžného jednořádkového textu. Pokud budete chtít tento dialog v aplikaci použít, postačuje vytvořit instanci třídy QInputDialog, nastavit typ vstupu na hodnotu QInputDialog.TextInput a po uzavření dialogu zjistit, jaký text byl uživatelem zapsán, pomocí metody QInputDialog.textValue():

def textInputDialogHandler(self):
    # vytvoření a konfigurace vstupního dialogu
    dialog = QtGui.QInputDialog(self)
    dialog.setInputMode(QtGui.QInputDialog.TextInput)
 
    # zobrazení dialogu a čekání na uživatelský vstup
    result = dialog.exec_()
 
    # zpracování výsledků
    return dialog.textValue()

Při práci s tímto typem dialogu můžeme použít několik metod pro jeho další konfiguraci:

Metoda Význam
setLabelText výzva, která je zobrazena nad nebo vedle vstupního textového pole
setTextValue výchozí text, který je do pole zapsán ve chvíli zobrazení dialogu
setOkButtonText text zobrazený na tlačítku [Ok]
setCancelButtonText text zobrazený na tlačítku [Storno]
setEchoMode nastavení zpětné vazby mezi zapisovaným textem a obsahem textového pole (modifikováno u zápisu hesla atd.)

Samotné vstupní textové pole se ovládá naprosto stejně jako již popsaný widget QLineEdit.

Většinou je nutné rozlišit, zda bylo stlačeno tlačítko [Ok] nebo [Storno]. Pro tento účel je nutné otestovat návratovou hodnotu metody QInputDialog.exec_(), například takto:

def textInputDialogHandler(self):
    # vytvoření a konfigurace vstupního dialogu
    dialog = QtGui.QInputDialog(self)
    dialog.setInputMode(QtGui.QInputDialog.TextInput)
    dialog.setLabelText("Text input:")
    dialog.setTextValue("default text")
 
    # zobrazení dialogu a čekání na uživatelský vstup
    result = dialog.exec_()
 
    # zpracování a zobrazení výsledků
    text = dialog.textValue()
    message = "Entered text: '{t}'\nClicked on: {c}".format(
        t=text, c="Ok" if result == 1 else "Cancel")
 
    self.showMessageBox(message)

Obrázek 6: Dialog pro vstup běžného jednořádkového textu.

8. Třetí demonstrační příklad: dialog pro zadání jednořádkového textu

V dnešním třetím demonstračním příkladu je ukázán jak způsob zobrazení dialogu určeného pro zadání jednořádkového textu, tak i otestování, zda uživatel po zadání textu vybral tlačítko [Ok] nebo [Storno], což je důležité, protože i při stisku tlačítka [Storno] se vrátí vyplněná hodnota textového políčka a nikoli (například) prázdný řetězec či None. Podívejme se nyní na zdrojový kód tohoto demonstračního příkladu:

#!/usr/bin/env python
# vim: set fileencoding=utf-8
 
import sys
 
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
 
 
# nový widget bude odvozen od obecného widgetu
class MainWindowContent(QtGui.QWidget):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindowContent, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        quitButton = self.prepareQuitButton()
 
        textInputDialogButton = self.prepareButton(
            "Text Input", self.textInputDialogHandler)
 
        # vytvoření správce geometrie
        topLayout = QtGui.QVBoxLayout()
 
        # umístění widgetů do okna
        topLayout.addWidget(textInputDialogButton)
        topLayout.addWidget(quitButton)
 
        # nastavení správce geometrie a vložení všech komponent do okna
        self.setLayout(topLayout)
 
    def textInputDialogHandler(self):
        # vytvoření a konfigurace vstupního dialogu
        dialog = QtGui.QInputDialog(self)
        dialog.setInputMode(QtGui.QInputDialog.TextInput)
        dialog.setLabelText("Text input:")
        dialog.setTextValue("default text")
 
        # zobrazení dialogu a čekání na uživatelský vstup
        result = dialog.exec_()
 
        # zpracování a zobrazení výsledků
        text = dialog.textValue()
        message = "Entered text: '{t}'\nClicked on: {c}".format(
            t=text, c="Ok" if result == 1 else "Cancel")
 
        self.showMessageBox(message)
 
    def prepareButton(self, label, handler):
        # tlačítko
        button = QtGui.QPushButton(label, self)
        button.resize(button.sizeHint())
 
        # navázání akce na signál
        button.clicked.connect(handler)
        return button
 
    def prepareQuitButton(self):
        # tlačítko
        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.resize(quitButton.sizeHint())
 
        # navázání akce na signál
        quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        return quitButton
 
    def showMessageBox(self, text):
        msgBox = QtGui.QMessageBox()
        msgBox.setText(text)
        msgBox.setIcon(QtGui.QMessageBox.Information)
        msgBox.exec_()
 
 
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindow, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        # velikost není potřeba specifikovat
        # self.resize(320, 240)
        self.setWindowTitle("QInputDialog")
 
        # vložení komponenty do okna
        self.setCentralWidget(MainWindowContent())
 
    def run(self, app):
        # zobrazení okna na obrazovce
        self.show()
        # vstup do smyčky událostí (event loop)
        app.exec_()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow().run(app)
 
 
if __name__ == '__main__':
    main()

9. Vstupní dialog nakonfigurovaný pro zadání celého čísla

Vstupní dialog QInputDialog je možné nakonfigurovat takovým způsobem, aby namísto libovolného textu bylo možné zadat pouze celočíselnou hodnotu, navíc v předem známém rozsahu. Vedle vstupního pole se zobrazí pomocná tlačítka „nahoru“ a „dolů“, kterými lze číselné hodnoty přetáčet (stejně bude fungovat i kolečko myši). Aby se skutečně povolil vstup celočíselných údajů, je nutné specifikovat vstupní režim, a to takto:

dialog.setInputMode(QtGui.QInputDialog.IntInput)

Dialog se zobrazí metodou exec_(), s níž jsme se již setkali v předchozích kapitolách. Po uzavření dialogu se přečtení hodnoty ze vstupního pole provádí metodou intValue() a nikoli textValue():

def integerInputDialogHandler(self):
    # vytvoření a konfigurace vstupního dialogu
    dialog = QtGui.QInputDialog(self)
    dialog.setInputMode(QtGui.QInputDialog.IntInput)
 
    # zobrazení dialogu a čekání na uživatelský vstup
    result = dialog.exec_()
 
    # zpracování výsledků
    return dialog.intValue()

Obrázek 7: Dialog pro vstup celočíselné hodnoty ze zadaného rozsahu.

Kromě již zmíněných metod je ještě možné nastavit další parametry pole pro vstup celočíselných údajů a tím do jisté míry omezit další programové kontroly prováděné po uzavření dialogu (implicitně je možné zadávat jen hodnoty do 99):

Metoda Význam
setIntValue výchozí číselná hodnota zobrazená společně s dialogem
setIntMinimum minimální povolená číselná hodnota
setIntMaximum maximální povolená číselná hodnota
setIntRange kombinace obou předchozích metod (předávají se dvě hodnoty min a max)
setIntStep krok při použití kolečka myši nebo tlačítek „nahoru“ a „dolů“

Výše uvedené metody se použijí takto:

def integerInputDialogHandler(self):
    # vytvoření a konfigurace vstupního dialogu
    dialog = QtGui.QInputDialog(self)
    dialog.setInputMode(QtGui.QInputDialog.IntInput)
    dialog.setLabelText("Integer input:")
    dialog.setIntValue(15)
    dialog.setIntMinimum(10)
    dialog.setIntMaximum(20)
 
    # zobrazení dialogu a čekání na uživatelský vstup
    result = dialog.exec_()
 
    # zpracování a zobrazení výsledků
    value = dialog.intValue()
    message = "Entered value: '{v}'\nClicked on: {c}".format(
        v=value, c="Ok" if result == 1 else "Cancel")

10. Čtvrtý demonstrační příklad: dialog pro specifikaci celého čísla

Použití standardního dialogu, který po svém zobrazení očekává zadání celého čísla od uživatele, je ukázáno v dnešním čtvrtém demonstračním příkladu, jehož zdrojový kód je zobrazen pod tímto odstavcem:

#!/usr/bin/env python
# vim: set fileencoding=utf-8
 
import sys
 
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
 
 
# nový widget bude odvozen od obecného widgetu
class MainWindowContent(QtGui.QWidget):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindowContent, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        quitButton = self.prepareQuitButton()
 
        integerInputDialogButton = self.prepareButton(
            "Integer value input", self.integerInputDialogHandler)
 
        # vytvoření správce geometrie
        topLayout = QtGui.QVBoxLayout()
 
        # umístění widgetů do okna
        topLayout.addWidget(integerInputDialogButton)
        topLayout.addWidget(quitButton)
 
        # nastavení správce geometrie a vložení všech komponent do okna
        self.setLayout(topLayout)
 
    def integerInputDialogHandler(self):
        # vytvoření a konfigurace vstupního dialogu
        dialog = QtGui.QInputDialog(self)
        dialog.setInputMode(QtGui.QInputDialog.IntInput)
        dialog.setLabelText("Integer input:")
        dialog.setIntMinimum(10)
        dialog.setIntMaximum(20)
 
        # zobrazení dialogu a čekání na uživatelský vstup
        result = dialog.exec_()
 
        # zpracování a zobrazení výsledků
        value = dialog.intValue()
        message = "Entered value: '{v}'\nClicked on: {c}".format(
            v=value, c="Ok" if result == 1 else "Cancel")
 
        self.showMessageBox(message)
 
    def prepareButton(self, label, handler):
        # tlačítko
        button = QtGui.QPushButton(label, self)
        button.resize(button.sizeHint())
 
        # navázání akce na signál
        button.clicked.connect(handler)
        return button
 
    def prepareQuitButton(self):
        # tlačítko
        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.resize(quitButton.sizeHint())
 
        # navázání akce na signál
        quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        return quitButton
 
    def showMessageBox(self, text):
        msgBox = QtGui.QMessageBox()
        msgBox.setText(text)
        msgBox.setIcon(QtGui.QMessageBox.Information)
        msgBox.exec_()
 
 
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindow, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        # velikost není potřeba specifikovat
        # self.resize(320, 240)
        self.setWindowTitle("QInputDialog")
 
        # vložení komponenty do okna
        self.setCentralWidget(MainWindowContent())
 
    def run(self, app):
        # zobrazení okna na obrazovce
        self.show()
        # vstup do smyčky událostí (event loop)
        app.exec_()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow().run(app)
 
 
if __name__ == '__main__':
    main()

11. Vstupní dialog nakonfigurovaný pro zadání reálného čísla

Jen nepatrnou úpravou je možné zajistit, aby vstupní dialog akceptoval reálná čísla a nikoli jen čísla celá:

dialog.setInputMode(QtGui.QInputDialog.DoubleInput)

U tohoto typu vstupu je opět možné nastavit minimální a maximální akceptovatelné hodnoty, navíc je ovšem možné specifikovat, kolik desetinných míst se implicitně zobrazí:

Metoda Význam
setDoubleValue výchozí číselná hodnota zobrazená společně s dialogem
setDoubleMinimum minimální povolená číselná hodnota
setDoubleMaximum maximální povolená číselná hodnota
setDoubleRange kombinace obou předchozích metod (předávají se dvě hodnoty min a max)
setDoubleStep krok při použití kolečka myši nebo tlačítek „nahoru“ a „dolů“
setDoubleDecimals počet zobrazených desetinných míst

Příklad použití dialogu pro zadání reálného čísla:

def doubleInputDialogHandler(self):
    # vytvoření a konfigurace vstupního dialogu
    dialog = QtGui.QInputDialog(self)
    dialog.setInputMode(QtGui.QInputDialog.DoubleInput)
    dialog.setLabelText("Double value input:")
    dialog.setDoubleRange(0.0, 7.5)
    dialog.setDoubleDecimals(2)
 
    # zobrazení dialogu a čekání na uživatelský vstup
    result = dialog.exec_()
 
    # zpracování a zobrazení výsledků
    value = dialog.doubleValue()
    message = "Entered value: '{v}'\nClicked on: {c}".format(
        v=value, c="Ok" if result == 1 else "Cancel")
 
    self.showMessageBox(message)

Obrázek 8: Dialog pro vstup reálné hodnoty ze zadaného rozsahu.

12. Pátý demonstrační příklad: dialog pro specifikaci reálného čísla

Opět se podívejme na to, jakým způsobem lze nakonfigurovat dialog určený pro specifikaci reálného čísla uživatelem. Používáme přitom metody popsané v předchozí kapitole. Následuje výpis zdrojového kódu demonstračního příkladu:

#!/usr/bin/env python
# vim: set fileencoding=utf-8
 
import sys
 
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
 
 
# nový widget bude odvozen od obecného widgetu
class MainWindowContent(QtGui.QWidget):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindowContent, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        quitButton = self.prepareQuitButton()
 
        doubleInputDialogButton = self.prepareButton(
            "Double value input", self.doubleInputDialogHandler)
 
        # vytvoření správce geometrie
        topLayout = QtGui.QVBoxLayout()
 
        # umístění widgetů do okna
        topLayout.addWidget(doubleInputDialogButton)
        topLayout.addWidget(quitButton)
 
        # nastavení správce geometrie a vložení všech komponent do okna
        self.setLayout(topLayout)
 
    def doubleInputDialogHandler(self):
        # vytvoření a konfigurace vstupního dialogu
        dialog = QtGui.QInputDialog(self)
        dialog.setInputMode(QtGui.QInputDialog.DoubleInput)
        dialog.setLabelText("Double value input:")
        dialog.setDoubleRange(0.0, 7.5)
        dialog.setDoubleDecimals(2)
 
        # zobrazení dialogu a čekání na uživatelský vstup
        result = dialog.exec_()
 
        # zpracování a zobrazení výsledků
        value = dialog.doubleValue()
        message = "Entered value: '{v}'\nClicked on: {c}".format(
            v=value, c="Ok" if result == 1 else "Cancel")
 
        self.showMessageBox(message)
 
    def prepareButton(self, label, handler):
        # tlačítko
        button = QtGui.QPushButton(label, self)
        button.resize(button.sizeHint())
 
        # navázání akce na signál
        button.clicked.connect(handler)
        return button
 
    def prepareQuitButton(self):
        # tlačítko
        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.resize(quitButton.sizeHint())
 
        # navázání akce na signál
        quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        return quitButton
 
    def showMessageBox(self, text):
        msgBox = QtGui.QMessageBox()
        msgBox.setText(text)
        msgBox.setIcon(QtGui.QMessageBox.Information)
        msgBox.exec_()
 
 
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindow, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        # velikost není potřeba specifikovat
        # self.resize(320, 240)
        self.setWindowTitle("QInputDialog")
 
        # vložení komponenty do okna
        self.setCentralWidget(MainWindowContent())
 
    def run(self, app):
        # zobrazení okna na obrazovce
        self.show()
        # vstup do smyčky událostí (event loop)
        app.exec_()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow().run(app)
 
 
if __name__ == '__main__':
    main()

13. Dialog s výběrem prvku ze seznamu nebo kombo boxu

Poslední možností, kterou nám QInputDialog nabízí, je výběr prvku z předem zadaného seznamu. Tento seznam se zobrazí buď pomocí kombo boxu (což šetří místo na úkor přehlednosti) nebo klasickým seznamem. Použití kombo boxu se provede následovně:

def textInputDialogHandler(self):
    # vytvoření a konfigurace vstupního dialogu
    dialog = QtGui.QInputDialog(self)
    dialog.setLabelText("Your choice:")
    dialog.setComboBoxItems(["Assembler", "Bash", "C", "C++", "Clojure", "Python"])
 
    # zobrazení dialogu a čekání na uživatelský vstup
    result = dialog.exec_()
 
    # zpracování výsledků
    return dialog.textValue()

Obrázek 9: Výběr prvku s využitím kombo boxu.

Pokud preferujete klasický seznam, je funkci zapotřebí nepatrně upravit:

def textInputDialogHandler(self):
    # vytvoření a konfigurace vstupního dialogu
    dialog = QtGui.QInputDialog(self)
    dialog.setLabelText("Your choice:")
    dialog.setOption(QtGui.QInputDialog.UseListViewForComboBoxItems, True)
    dialog.setComboBoxItems(["Assembler", "Bash", "C", "C++", "Clojure", "Python"])
 
    # zobrazení dialogu a čekání na uživatelský vstup
    result = dialog.exec_()
 
    # zpracování výsledků
    return dialog.textValue()

14. Šestý demonstrační příklad: výběr prvku z kombo boxu

Zobrazení dialogu, který si od uživatele vyžádá výběr prvku z kombo boxu, je implementováno v dnešním šestém demonstračním příkladu, jehož zdrojový kód je zobrazen pod tímto odstavcem:

#!/usr/bin/env python
# vim: set fileencoding=utf-8
 
import sys
 
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
 
 
# nový widget bude odvozen od obecného widgetu
class MainWindowContent(QtGui.QWidget):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindowContent, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        quitButton = self.prepareQuitButton()
 
        textInputDialogButton = self.prepareButton(
            "Text Input", self.textInputDialogHandler)
 
        # vytvoření správce geometrie
        topLayout = QtGui.QVBoxLayout()
 
        # umístění widgetů do okna
        topLayout.addWidget(textInputDialogButton)
        topLayout.addWidget(quitButton)
 
        # nastavení správce geometrie a vložení všech komponent do okna
        self.setLayout(topLayout)
 
    def textInputDialogHandler(self):
        # vytvoření a konfigurace vstupního dialogu
        dialog = QtGui.QInputDialog(self)
        dialog.setLabelText("Your choice:")
        dialog.setComboBoxItems(["Assembler", "Bash", "C", "C++", "Clojure", "Python"])
 
        # zobrazení dialogu a čekání na uživatelský vstup
        result = dialog.exec_()
 
        # zpracování a zobrazení výsledků
        text = dialog.textValue()
        message = "Entered text: '{t}'\nClicked on: {c}".format(
            t=text, c="Ok" if result == 1 else "Cancel")
 
        self.showMessageBox(message)
 
    def prepareButton(self, label, handler):
        # tlačítko
        button = QtGui.QPushButton(label, self)
        button.resize(button.sizeHint())
 
        # navázání akce na signál
        button.clicked.connect(handler)
        return button
 
    def prepareQuitButton(self):
        # tlačítko
        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.resize(quitButton.sizeHint())
 
        # navázání akce na signál
        quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        return quitButton
 
    def showMessageBox(self, text):
        msgBox = QtGui.QMessageBox()
        msgBox.setText(text)
        msgBox.setIcon(QtGui.QMessageBox.Information)
        msgBox.exec_()
 
 
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindow, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        # velikost není potřeba specifikovat
        # self.resize(320, 240)
        self.setWindowTitle("QInputDialog")
 
        # vložení komponenty do okna
        self.setCentralWidget(MainWindowContent())
 
    def run(self, app):
        # zobrazení okna na obrazovce
        self.show()
        # vstup do smyčky událostí (event loop)
        app.exec_()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow().run(app)
 
 
if __name__ == '__main__':
    main()

15. Sedmý demonstrační příklad: výběr prvku ze seznamu

Sedmý demonstrační příklad se od příkladu předchozího odlišuje pouze v jediném řádku:

dialog.setOption(QtGui.QInputDialog.UseListViewForComboBoxItems, True)

Tímto řádkem se specifikuje použití klasického list boxu namísto kombo boxu. Navíc si povšimněte, že implicitně není vybrán žádný prvek a tudíž dialog zobrazí tlačítko [Ok] šedou barvou a nebude ho možné stisknout do té doby, dokud uživatel nějaký prvek explicitně nevybere:

Obrázek 10: Screenshot dialogu ze sedmého demonstračního příkladu.

Opět následuje výpis zdrojového kódu tohoto příkladu:

#!/usr/bin/env python
# vim: set fileencoding=utf-8
 
import sys
 
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
 
 
# nový widget bude odvozen od obecného widgetu
class MainWindowContent(QtGui.QWidget):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindowContent, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        quitButton = self.prepareQuitButton()
 
        textInputDialogButton = self.prepareButton(
            "Text Input", self.textInputDialogHandler)
 
        # vytvoření správce geometrie
        topLayout = QtGui.QVBoxLayout()
 
        # umístění widgetů do okna
        topLayout.addWidget(textInputDialogButton)
        topLayout.addWidget(quitButton)
 
        # nastavení správce geometrie a vložení všech komponent do okna
        self.setLayout(topLayout)
 
    def textInputDialogHandler(self):
        # vytvoření a konfigurace vstupního dialogu
        dialog = QtGui.QInputDialog(self)
        dialog.setLabelText("Your choice:")
        dialog.setOption(QtGui.QInputDialog.UseListViewForComboBoxItems, True)
        dialog.setComboBoxItems(["Assembler", "Bash", "C", "C++", "Clojure", "Python"])
 
        # zobrazení dialogu a čekání na uživatelský vstup
        result = dialog.exec_()
 
        # zpracování a zobrazení výsledků
        text = dialog.textValue()
        message = "Entered text: '{t}'\nClicked on: {c}".format(
            t=text, c="Ok" if result == 1 else "Cancel")
 
        self.showMessageBox(message)
 
    def prepareButton(self, label, handler):
        # tlačítko
        button = QtGui.QPushButton(label, self)
        button.resize(button.sizeHint())
 
        # navázání akce na signál
        button.clicked.connect(handler)
        return button
 
    def prepareQuitButton(self):
        # tlačítko
        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.resize(quitButton.sizeHint())
 
        # navázání akce na signál
        quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        return quitButton
 
    def showMessageBox(self, text):
        msgBox = QtGui.QMessageBox()
        msgBox.setText(text)
        msgBox.setIcon(QtGui.QMessageBox.Information)
        msgBox.exec_()
 
 
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindow, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        # velikost není potřeba specifikovat
        # self.resize(320, 240)
        self.setWindowTitle("QInputDialog")
 
        # vložení komponenty do okna
        self.setCentralWidget(MainWindowContent())
 
    def run(self, app):
        # zobrazení okna na obrazovce
        self.show()
        # vstup do smyčky událostí (event loop)
        app.exec_()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow().run(app)
 
 
if __name__ == '__main__':
    main()

16. Standardní dialog pro výběr barvy z palety

Poslední typ standardního dialogu, s nímž se dnes setkáme, slouží pro výběr barvy z barvové palety. Tento dialog je představován třídou QColorDialog a zobrazit je ho snadné:

def showColorDialog(self):
    colorDialog = QtGui.QColorDialog()
    result = colorDialog.exec_()
 
    selected = colorDialog.selectedColor()

Před zobrazením tohoto dialogu je možné přednastavit barvu, a to s využitím metody setCurrentColor(), které se předá instanci třídy QColor:

def showColorDialog(self):
    colorDialog = QtGui.QColorDialog()
    colorDialog.setCurrentColor(QtGui.QColor("#aabbcc"))
    result = colorDialog.exec_()
 
    selected = colorDialog.selectedColor()

Pokud budete chtít zjistit, jakou barvu uživatel vybral, stačí po zobrazení dialogu zavolat metodu selectedColor() a z navrácené hodnoty pak metodami red(), green() a blue() získat jednotlivé barvové složky:

def showColorDialog(self):
    colorDialog = QtGui.QColorDialog()
    colorDialog.setCurrentColor(QtGui.QColor("#aabbcc"))
    result = colorDialog.exec_()
 
    selected = colorDialog.selectedColor()
    message = "Selected color: {r} {g} {b}\nClicked on: {c}".format(
        r=selected.red(),
        g=selected.green(),
        b=selected.blue(),
        c="Ok" if result == 1 else "Cancel")
 
    self.showMessageBox(message)

Obrázek 11: Standardní dialog pro výběr barvy.

17. Osmý demonstrační příklad: dialog pro výběr barvy

V osmém demonstračním příkladu si ukážeme, jakým způsobem je možné použít standardní dialog určený pro výběr barvy. Základní postup pro použití tohoto typu dialogu jsme si již vysvětlili v předchozí kapitole, takže zde jen pro úplnost dialog zabudujeme do naší testovací aplikace:

#!/usr/bin/env python
# vim: set fileencoding=utf-8
 
import sys
 
# import "jádra" frameworku Qt i modulu pro GUI
from PySide import QtCore
from PySide import QtGui
 
 
# nový widget bude odvozen od obecného widgetu
class MainWindowContent(QtGui.QWidget):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindowContent, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        quitButton = self.prepareQuitButton()
        colorDialogButton = self.prepareColorDialogButton()
 
        # vytvoření správce geometrie
        topLayout = QtGui.QVBoxLayout()
 
        # umístění widgetů do okna
        topLayout.addWidget(colorDialogButton)
        topLayout.addWidget(quitButton)
 
        # nastavení správce geometrie a vložení všech komponent do okna
        self.setLayout(topLayout)
 
    def prepareColorDialogButton(self):
        # tlačítko
        colorDialogButton = QtGui.QPushButton('Select color', self)
        colorDialogButton.resize(colorDialogButton.sizeHint())
 
        # navázání akce na signál
        colorDialogButton.clicked.connect(self.showColorDialog)
        return colorDialogButton
 
    def prepareQuitButton(self):
        # tlačítko
        quitButton = QtGui.QPushButton('Quit', self)
        quitButton.resize(quitButton.sizeHint())
 
        # navázání akce na signál
        quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)
        return quitButton
 
    def showColorDialog(self):
        colorDialog = QtGui.QColorDialog()
        colorDialog.setCurrentColor(QtGui.QColor("#aabbcc"))
        result = colorDialog.exec_()
 
        selected = colorDialog.selectedColor()
        message = "Selected color: {r} {g} {b}\nClicked on: {c}".format(
            r=selected.red(),
            g=selected.green(),
            b=selected.blue(),
            c="Ok" if result == 1 else "Cancel")
 
        self.showMessageBox(message)
 
    def showMessageBox(self, text):
        msgBox = QtGui.QMessageBox()
        msgBox.setText(text)
        msgBox.setIcon(QtGui.QMessageBox.Information)
        msgBox.exec_()
 
 
# nový widget bude odvozen od obecného hlavního okna
class MainWindow(QtGui.QMainWindow):
 
    def __init__(self):
        # zavoláme konstruktor předka
        super(MainWindow, self).__init__()
 
        # konfigurace GUI + přidání widgetu do okna
        self.prepareGUI()
 
    def prepareGUI(self):
        # velikost není potřeba specifikovat
        # self.resize(320, 240)
        self.setWindowTitle("QColorDialog")
 
        # vložení komponenty do okna
        self.setCentralWidget(MainWindowContent())
 
    def run(self, app):
        # zobrazení okna na obrazovce
        self.show()
        # vstup do smyčky událostí (event loop)
        app.exec_()
 
 
def main():
    app = QtGui.QApplication(sys.argv)
    MainWindow().run(app)
 
 
if __name__ == '__main__':
    main()

18. Repositář s demonstračními příklady

Zdrojové kódy všech osmi dnes popsaných demonstračních příkladů byly opět, podobně jako tomu bylo i v předchozích článcích, uloženy do Git repositáře dostupného na adrese https://github.com/tisnik/pre­sentations. Pokud nechcete klonovat celý repositář, můžete namísto toho použít odkazy na jednotlivé příklady, které naleznete v následující tabulce:

19. Odkazy na Internetu

  1. PySide 1.2.1 documentation
    https://pyside.github.io/doc­s/pyside/index.html
  2. QAbstractSlider
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/Abstrac­tSlider.html
  3. QScrollBar
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/Scro­llBar.html
  4. QSlider
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/Sli­der.html
  5. QDial
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/Dial­.html
  6. QImage
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QIma­ge.html
  7. QPixmap
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QPix­map.html
  8. QBitmap
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QBit­map.html
  9. QPaintDevice
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QPa­intDevice.html
  10. QPicture
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QPic­ture.html
  11. QPainter
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QPa­inter.html
  12. QPainterPath
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QPa­interPath.html
  13. QGradient
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QGra­dient.html
  14. QLinearGradient
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QLi­nearGradient.html
  15. QRadialGradient
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QRa­dialGradient.html
  16. QTableWidget
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QTa­bleWidget.html
  17. QTableWidgetItem
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QTa­bleWidgetItem.html
  18. QTreeWidget
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QTre­eWidget.html
  19. QTreeWidgetItem
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QTre­eWidgetItem.html
  20. Afinní zobrazení
    https://cs.wikipedia.org/wi­ki/Afinn%C3%AD_zobrazen%C3%AD
  21. Differences Between PySide and PyQt
    https://wiki.qt.io/Differen­ces_Between_PySide_and_PyQt
  22. PySide 1.2.1 tutorials
    https://pyside.github.io/doc­s/pyside/tutorials/index.html
  23. PySide tutorial
    http://zetcode.com/gui/py­sidetutorial/
  24. Drawing in PySide
    http://zetcode.com/gui/py­sidetutorial/drawing/
  25. Qt Core
    https://pyside.github.io/doc­s/pyside/PySide/QtCore/Qt­.html
  26. QLayout
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QLa­yout.html
  27. QValidator
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QVa­lidator.html
  28. QStackedLayout
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QStac­kedLayout.html
  29. QFormLayout
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QFor­mLayout.html
  30. QBoxLayout
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QBox­Layout.html
  31. QHBoxLayout
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QHBox­Layout.html
  32. QVBoxLayout
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QVBox­Layout.html
  33. QGridLayout
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QGrid­Layout.html
  34. QAction
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QAc­tion.html
  35. QDialog
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QDi­alog.html
  36. QMessageBox
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QMes­sageBox.html
  37. QErrorMessage
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QError­Message.html
  38. QInputDialog
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QIn­putDialog.html
  39. QColorDialog
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QCo­lorDialog.html
  40. QListWidget
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QLis­tWidget.html
  41. Signals & Slots
    http://doc.qt.io/qt-4.8/signalsandslots.html
  42. Signals and Slots in PySide
    http://wiki.qt.io/Signals_an­d_Slots_in_PySide
  43. Intro to PySide/PyQt: Basic Widgets and Hello, World!
    http://www.pythoncentral.io/intro-to-pysidepyqt-basic-widgets-and-hello-world/
  44. QLineEdit
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QLi­neEdit.html
  45. QTextEdit
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QTex­tEdit.html
  46. QValidator
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QVa­lidator.html
  47. QIntValidator
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QIn­tValidator.html
  48. QRegExpValidator
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QRe­gExpValidator.html
  49. QWidget
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QWid­get.html
  50. QMainWindow
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QMa­inWindow.html
  51. QLabel
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QLa­bel.html
  52. QAbstractButton
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QAb­stractButton.html
  53. QCheckBox
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QChec­kBox.html
  54. QRadioButton
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QRa­dioButton.html
  55. QButtonGroup
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QBut­tonGroup.html
  56. QFrame
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QFra­me.html#PySide.QtGui.PySi­de.QtGui.QFrame
  57. QFrame.frameStyle
    https://pyside.github.io/doc­s/pyside/PySide/QtGui/QFra­me.html#PySide.QtGui.PySi­de.QtGui.QFrame.frameStyle
  58. Leo editor
    http://leoeditor.com/
  59. IPython Qt Console aneb vylepšený pseudoterminál
    https://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-ipython-a-ipython-notebook/#k06
  60. Vývojová prostředí ve Fedoře (4. díl)
    https://mojefedora.cz/vyvojova-prostredi-ve-fedore-4-dil/
  61. Seriál Letní škola programovacího jazyka Logo
    http://www.root.cz/serialy/letni-skola-programovaciho-jazyka-logo/
  62. Educational programming language
    http://en.wikipedia.org/wi­ki/Educational_programmin­g_language
  63. Logo Tree Project:
    http://www.elica.net/downlo­ad/papers/LogoTreeProject­.pdf
  64. Hra Breakout napísaná v Tkinteri
    https://www.root.cz/clanky/hra-breakout-napisana-v-tkinteri/
  65. Hra Snake naprogramovaná v Pythone s pomocou Tkinter
    https://www.root.cz/clanky/hra-snake-naprogramovana-v-pythone-s-pomocou-tkinter/
  66. 24.1. turtle — Turtle graphics
    https://docs.python.org/3­.5/library/turtle.html#mo­dule-turtle
  67. TkDND
    http://freecode.com/projects/tkdnd
  68. Python Tkinter Fonts
    https://www.tutorialspoin­t.com/python/tk_fonts.htm
  69. The Tkinter Canvas Widget
    http://effbot.org/tkinter­book/canvas.htm
  70. Ovládací prvek (Wikipedia)
    https://cs.wikipedia.org/wi­ki/Ovl%C3%A1dac%C3%AD_prvek_­%28po%C4%8D%C3%ADta%C4%8D%29
  71. Rezervovaná klíčová slova v Pythonu
    https://docs.python.org/3/re­ference/lexical_analysis.html#ke­ywords
  72. TkDocs: Styles and Themes
    http://www.tkdocs.com/tuto­rial/styles.html
  73. Drawing in Tkinter
    http://zetcode.com/gui/tkin­ter/drawing/
  74. Changing ttk widget text color (StackOverflow)
    https://stackoverflow.com/qu­estions/16240477/changing-ttk-widget-text-color
  75. The Hitchhiker's Guide to Pyhton: GUI Applications
    http://docs.python-guide.org/en/latest/scenarios/gui/
  76. 7 Top Python GUI Frameworks for 2017
    http://insights.dice.com/2014/11/26/5-top-python-guis-for-2015/
  77. GUI Programming in Python
    https://wiki.python.org/mo­in/GuiProgramming
  78. Cameron Laird's personal notes on Python GUIs
    http://phaseit.net/claird/com­p.lang.python/python_GUI.html
  79. Python GUI development
    http://pythoncentral.io/introduction-python-gui-development/
  80. Graphic User Interface FAQ
    https://docs.python.org/2/faq/gu­i.html#graphic-user-interface-faq
  81. TkInter
    https://wiki.python.org/moin/TkInter
  82. Tkinter 8.5 reference: a GUI for Python
    http://infohost.nmt.edu/tcc/hel­p/pubs/tkinter/web/index.html
  83. TkInter (Wikipedia)
    https://en.wikipedia.org/wiki/Tkinter
  84. appJar
    http://appjar.info/
  85. appJar (Wikipedia)
    https://en.wikipedia.org/wiki/AppJar
  86. appJar na Pythonhosted
    http://pythonhosted.org/appJar/
  87. appJar widgets
    http://appjar.info/pythonWidgets/
  88. Stránky projektu PyGTK
    http://www.pygtk.org/
  89. PyGTK (Wikipedia)
    https://cs.wikipedia.org/wiki/PyGTK
  90. Stránky projektu PyGObject
    https://wiki.gnome.org/Pro­jects/PyGObject
  91. Stránky projektu Kivy
    https://kivy.org/#home
  92. Stránky projektu PyQt
    https://riverbankcomputin­g.com/software/pyqt/intro
  93. PyQt (Wikipedia)
    https://cs.wikipedia.org/wiki/PyGTK
  94. Stránky projektu PySide
    https://wiki.qt.io/PySide
  95. PySide (Wikipedia)
    https://en.wikipedia.org/wiki/PySide
  96. Stránky projektu Kivy
    https://kivy.org/#home
  97. Kivy (framework, Wikipedia)
    https://en.wikipedia.org/wi­ki/Kivy_(framework)
  98. QML Applications
    http://doc.qt.io/qt-5/qmlapplications.html
  99. KDE
    https://www.kde.org/
  100. Qt
    https://www.qt.io/
  101. GNOME
    https://en.wikipedia.org/wiki/GNOME
  102. Category:Software that uses PyGTK
    https://en.wikipedia.org/wi­ki/Category:Software_that_u­ses_PyGTK
  103. Category:Software that uses PyGObject
    https://en.wikipedia.org/wi­ki/Category:Software_that_u­ses_PyGObject
  104. Category:Software that uses wxWidgets
    https://en.wikipedia.org/wi­ki/Category:Software_that_u­ses_wxWidgets
  105. GIO
    https://developer.gnome.or­g/gio/stable/
  106. GStreamer
    https://gstreamer.freedesktop.org/
  107. GStreamer (Wikipedia)
    https://en.wikipedia.org/wi­ki/GStreamer
  108. Wax Gui Toolkit
    https://wiki.python.org/moin/Wax
  109. Python Imaging Library (PIL)
    http://infohost.nmt.edu/tcc/hel­p/pubs/pil/
  110. Why Pyjamas Isn’t a Good Framework for Web Apps (blogpost z roku 2012)
    http://blog.pyjeon.com/2012/07/29/why-pyjamas-isnt-a-good-framework-for-web-apps/
Našli jste v článku chybu?