pyqt5 Tutorial
Iniziare con pyqt5
Ricerca…
Osservazioni
Questa sezione fornisce una panoramica di cosa sia Pyqt5 e perché uno sviluppatore potrebbe volerlo utilizzare.
Dovrebbe anche menzionare qualsiasi argomento di grandi dimensioni all'interno di pyqt5 e collegarsi agli argomenti correlati. Poiché la documentazione di pyqt5 è nuova, potrebbe essere necessario creare versioni iniziali di tali argomenti correlati.
Installazione o configurazione
- Installa Anaconda (PyQt5 è built-in), specialmente per utenti Windows.
- Integrare QtDesigner e QtUIConvert in PyCharm (strumenti esterni)
- Scrivi Demo
- nuovo window.ui per strumento esterno (QtDesigner)
- convertire in window.py con uno strumento esterno (PyUIConv)
- dimostrazione
import sys from PyQt5.QtWidgets import QApplication,QMainWindow from window import Ui_MainWindow if __name__ == '__main__': app = QApplication(sys.argv) w = QMainWindow() ui = Ui_MainWindow() ui.setupUi(w) w.show() sys.exit(app.exec_())
Ciao esempio del mondo
Questo esempio crea una finestra semplice con un pulsante e una modifica di riga in un layout. Mostra anche come collegare un segnale a uno slot, in modo che facendo clic sul pulsante si aggiunga del testo alla modifica della riga.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Hello World')
w.show()
sys.exit(app.exec_())
Analisi
app = QtWidgets.QApplication(sys.argv)
Ogni applicazione PyQt5 deve creare un oggetto applicazione. Il parametro sys.argv è un elenco di argomenti da una riga di comando. Gli script Python possono essere eseguiti dalla shell.
w = QWidget()
Il widget QWidget
è la classe base di tutti gli oggetti dell'interfaccia utente in PyQt5. Forniamo il costruttore predefinito per QWidget
. Il costruttore predefinito non ha un genitore. Un widget senza genitore è chiamato una finestra.
w.resize(250, 150)
Il metodo resize()
ridimensiona il widget. È largo 250px e alto 150px.
w.move(300, 300)
Il metodo move()
sposta il widget in una posizione sullo schermo con x = 300, y = 300 coordinate.
w.setWindowTitle('Hello World')
Qui impostiamo il titolo per la nostra finestra. Il titolo è mostrato nella barra del titolo.
w.show()
Il metodo show()
visualizza il widget sullo schermo. Un widget viene prima creato in memoria e successivamente mostrato sullo schermo.
sys.exit(app.exec_())
Infine, entriamo nel mainloop dell'applicazione. La gestione degli eventi inizia da questo punto. Il mainloop riceve eventi dal sistema di finestre e li invia ai widget dell'applicazione. Il mainloop termina se chiamiamo il metodo exit()
o il widget principale viene distrutto. Il metodo sys.exit()
garantisce un'uscita pulita. L'ambiente verrà informato su come è finita l'applicazione.
Il metodo exec_()
ha un trattino basso. È perché l'exec è una parola chiave Python. E così, exec_()
, è stato usato exec_()
.
Aggiunta di un'icona di applicazione
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Analisi
Argomenti di funzione in Python
In Python, le funzioni definite dall'utente possono assumere quattro diversi tipi di argomenti.
- Argomenti predefiniti:
Definizione della funzione
def defaultArg( name, msg = "Hello!"):
Chiamata di funzione
defaultArg( name)
- Argomenti richiesti:
Definizione della funzione
def requiredArg (str,num):
Chiamata di funzione:
requiredArg ("Hello",12)
- Argomenti della parola chiave:
Definizione della funzione
def keywordArg( name, role ):
Chiamata di funzione
keywordArg( name = "Tom", role = "Manager")
o
keywordArg( role = "Manager", name = "Tom")
- Numero variabile di argomenti:
Definizione della funzione
def varlengthArgs(*varargs):
Chiamata di funzione
varlengthArgs(30,40,50,60)
class Example(QWidget):
def __init__(self):
super().__init__()
...
Tre cose importanti nella programmazione orientata agli oggetti sono classi, dati e metodi. Qui creiamo una nuova classe chiamata Example
. La classe Example
eredita dalla classe QWidget
. Ciò significa che chiamiamo due costruttori: il primo per la classe Example
e il secondo per la classe ereditata. Il metodo super()
restituisce l'oggetto padre della classe Example
e chiamiamo il suo costruttore. La variabile self
riferisce all'oggetto stesso.
Perché abbiamo usato __init__
?
Controllalo:
class A(object):
def __init__(self):
self.lst = []
class B(object):
lst = []
e ora prova:
>>> x = B()
>>> y = B()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1, 2]
>>> x.lst is y.lst
True
e questo:
>>> x = A()
>>> y = A()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1]
>>> x.lst is y.lst
False
Questo significa che x in classe B è stabilito prima dell'istanziazione?
Sì, è un attributo di classe (è condiviso tra le istanze). Mentre è in classe A è un attributo di istanza.
self.initUI()
La creazione della GUI è delegata al metodo initUI()
.
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
Tutti e tre i metodi sono stati ereditati dalla classe QWidget
. setGeometry()
fa due cose: individua la finestra sullo schermo e imposta le sue dimensioni. I primi due parametri sono le posizioni xey della finestra. Il terzo è la larghezza e il quarto è l'altezza della finestra. In effetti, combina i metodi resize()
e move()
in un unico metodo. L'ultimo metodo imposta l'icona dell'applicazione. Per fare questo, abbiamo creato un oggetto QIcon
. QIcon
riceve il percorso della nostra icona per essere visualizzato.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Gli oggetti applicazione e di esempio vengono creati. Il ciclo principale è iniziato.
Mostrando un suggerimento
import sys
from PyQt5.QtWidgets import (QWidget, QToolTip,
QPushButton, QApplication)
from PyQt5.QtGui import QFont
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
self.setToolTip('This is a <b>QWidget</b> widget')
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
btn.resize(btn.sizeHint())
btn.move(50, 50)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Tooltips')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Analisi
QToolTip.setFont(QFont('SansSerif', 10))
Questo metodo statico imposta un font utilizzato per il rendering dei tooltip. Utilizziamo un font SansSerif 10px.
self.setToolTip('This is a <b>QWidget</b> widget')
Per creare un suggerimento, chiamiamo il metodo setTooltip()
. Possiamo usare la formattazione rich text.
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
Creiamo un widget pulsante e impostiamo un suggerimento per esso.
btn.resize(btn.sizeHint())
btn.move(50, 50)
Il pulsante viene ridimensionato e spostato sulla finestra. Il metodo sizeHint()
fornisce una dimensione consigliata per il pulsante.
Imballa il tuo progetto in excutable / installer
cx_Freeze - uno strumento può impacchettare il tuo progetto su excutable / installer
- dopo averlo installato da pip, per
demo.py
, abbiamo bisogno disetup.py
qui sotto.
import sys
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
"excludes": ["tkinter"],
"include_files":[('./platforms','./platforms')] # need qwindows.dll for qt5 application
}
# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
base = "Win32GUI"
setup( name = "demo",
version = "0.1",
description = "demo",
options = {"build_exe": build_exe_options},
executables = [Executable("demo.py", base=base)])
- quindi costruisci
python .\setup.py build
- quindi dist
python .\setup.py bdist_msi