Урок за PyQt5 с примери: Проектирайте GUI с помощта на PyQt в Python
Какво е PyQt?
PyQt е обвързване на python на набора от инструменти за джаджи с отворен код Qt, който също функционира като рамка за разработка на приложения за различни платформи. Qt е популярен C++ рамка за писане на GUI приложения за всички основни настолни, мобилни и вградени платформи (поддържа Linux, Windows, MacOS, Android, iOS, Raspberry Pi и други).
PyQt е безплатен софтуер, разработен и поддържан от Riverbank Computing, компания, базирана в Англия, докато Qt е разработен от финландска фирма, наречена The Qt Company.
Характеристики на PyQT
Ето важни характеристики на PyQt:
Научете PyQt, който се състои от повече от шестстотин класа, покриващи набор от функции като
- Графични потребителски интерфейси
- SQL бази данни
- Уеб инструменти
- XML обработка
- Мрежи
Тези функции могат да се комбинират за създаване на разширени потребителски интерфейси, както и самостоятелни приложения. Много големи компании във всички индустрии използват Qt. Някои примери са LG, Mercedes, AMD, Panasonic, Harman и др.
Версии на PyQt
PyQt се предлага в две издания, PyQt4 и PyQt5. PyQt4 осигурява свързващ код за обвързване на версии 4.x и 5.x на Qt framework, докато PyQt5 осигурява обвързване само за версиите 5.x. В резултат на това PyQt5 не е обратно съвместим с отхвърлените модули на по-старата версия. В този урок за GUI на Qt, PyQt5 ще бъде използван за демонстрация на примери. Освен тези две версии,
Riverbank Computing също така предоставя PyQt3D—обвързването на python за Qt3D рамката. Qt3D е рамка за приложения, използвана за създаване на симулационни системи в реално време с 2D/3D изобразяване.
Как да инсталирате PyQt5
В този урок за PyQt5 ще видим двата начина за инсталиране на PyQt:
- Използване на Wheel файлове
- Изграждане и инсталиране от изходния код
Qt (произнася се сладък) е сложна система и кодовата база на PyQt съдържа компилиран C++ намлява Python код под капака. В резултат на това е сложен процес да се създаде и инсталира от източника в сравнение с други библиотеки на Python. Можете обаче лесно да инсталирате PyQt5 с помощта на колела.
Монтаж с колела
Колелата са новият стандарт Python формат на опаковка и разпространение. Най-просто казано, колелото е ZIP архив със специално име и .whl файлово разширение. Колелата могат да се монтират с помощта на pip (Pythonмениджър на пакети), който е включен по подразбиране в последните версии на Python.
Така че, ако имате Python 3.4 или по-нова версия, вече имате pip. Ако обаче използвате по-стара версия на Python, трябва да изтеглите и инсталирате pip, преди да продължите напред. Можете да потърсите инструкции за това на тази връзка: https://pypi.org/project/pip/.
За да инсталирате PyQt5,
Стъпка 1) Отворете командния ред.
Отворете командния ред или PowerShell във вашия Windows машина.
Стъпка 2) Въведете следното.
pip install PyQt5
Стъпка 3) Инсталацията е успешна.
Тази стъпка в този урок за PyQt5 ще изтегли пакета PyQt5 whl (около 50 MB) и ще го инсталира на вашата система.
Като алтернатива можете също да изтеглите a Windows двоичен за версията на python, инсталирана на вашия компютър.
След като приключи, преминете към следващия раздел в този урок за PyQt5, за да напишете първото си GUI приложение.
Основен PyQt Concepts и програми
Сега, след като успешно сте инсталирали PyQt5 на вашия компютър, вие сте готови да пишете Python Приложения за GUI дизайн.
Нека започнем с просто приложение в този урок за PyQt5, което ще покаже празен прозорец на вашия екран.
Запалете своя питон IDLE и въведете следното:
Програма 1
import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99") w.show() sys.exit(app.exec_())
Запазете го като app.py (името няма значение) и натиснете F5, за да стартирате програмата. Като алтернатива, просто щракнете двукратно върху вашия запазен файл, за да стартирате приложението. Ако сте направили всичко правилно, ще се отвори нов прозорец със заглавие Guru99, както е показано по-долу.
Страхотно! Работи. Не е много, но е достатъчно, за да схванете основите. Сега в този урок за PyQt нека видим подробно какво прави всеки от редовете във вашата програма.
from PyQt5.QtWidgets import QApplication, QWidget
Този оператор импортира всички модули, от които се нуждаете, за да създадете GUI, в текущото пространство от имена. Модулът QtWidgets съдържа всички основни модули, които ще използвате в това Python Урок за Qt.
app = QApplication(sys.argv)
Тук създавате обект от класа QApplication. Тази стъпка е необходимост за PyQt5; всяко UI приложение трябва да създаде екземпляр на QApplication, като вид входна точка в приложението. Ако не го създадете, ще се показват грешки.
sys.argv е списъкът с параметри на командния ред, които можете да предадете на приложението, когато го стартирате през обвивката или докато автоматизирате интерфейса.
В този пример на PyQt5 не сте предали никакви аргументи на QApplications. Следователно можете също да го замените с кода по-долу и дори да не се налага да импортирате sys модула.
app = QApplication([])
w = QWidget()
След това създаваме обект от класа QWidget. QWidget е основният клас на всички UI обекти в Qt и почти всичко, което виждате в едно приложение, е widget. Това включва диалогови прозорци, текстове, бутони, ленти и т.н. Характеристиката, която ви позволява да проектирате сложни потребителски интерфейси, е, че джаджите могат да бъдат вложени, т.е. можете да имате джаджа вътре в джаджа, която е вътре в друга джаджа. Ще видите това в действие в следващия раздел.
w.resize(300,300)
Методът за преоразмеряване на класа QWidget ви позволява да зададете размерите на всяка джаджа. В този случай вие сте преоразмерили прозореца до 300px на 300px.
Тук трябва да запомните, че изпълнимите елементи могат да бъдат вложени заедно, най-външният изпълним елемент (т.е. изпълнимият елемент без родител) се нарича прозорец.
w.setWindowTitle("Guru99")
Методът setWindowTitle() ви позволява да подадете низ като аргумент, който ще зададе заглавието на прозореца на низа, който подавате. В примера на PyQt5 заглавната лента ще показва Guru99.
w.show()
show() просто показва уиджета на екрана на монитора.
sys.exit(app.exec_())
Методът app.exec_() стартира Qt/C++ цикъл на събитието. Както знаете, PyQt до голяма степен е написан на C++ и използва механизма за цикъл на събития, за да реализира паралелно изпълнение. app.exec_() предава контрола на Qt, който ще излезе от приложението само когато потребителят го затвори от GUI. Ето защо ctrl+c няма да излезе от приложението, както в други програми на Python. Тъй като Qt има контрол над приложението, събитията на python не се обработват, освен ако не ги настроим в приложението. Също така имайте предвид, че методът exec има долна черта в името си; това е така, защото exec() вече е била ключова дума в python и долната черта разрешава конфликта при именуване.
Отвъд празните прозорци
В предишния раздел видяхте как да направите основен уиджет в Qt. Сега е време да създадем някои по-ангажирани интерфейси, с които потребителите наистина да могат да взаимодействат. Отново запалете своя IDLE и напишете следното.
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox def dialog(): mbox = QMessageBox() mbox.setText("Your allegiance has been noted") mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru") mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) mbox.exec_() if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99") label = QLabel(w) label.setText("Behold the Guru, Guru99") label.move(100,130) label.show() btn = QPushButton(w) btn.setText('Beheld') btn.move(110,150) btn.show() btn.clicked.connect(dialog) w.show() sys.exit(app.exec_())
Запазете файла като appone.py или както искате и натиснете F5, за да стартирате програмата. Ако не сте правили грешки, IDLE ще отвори нов прозорец с малко текст и бутон, както е показано по-долу.
- След като щракнете върху бутона в първия прозорец, ще се отвори ново съобщение с текста, който сте написали.
- Вече можете да щракнете върху бутона Скриване на подробности/Показване на подробности, за да превключите видимостта на допълнителен текст.
Както можете да видите, тъй като не бяхме задали заглавие на прозорец в полето за съобщения, заглавието по подразбиране беше предоставено от самия python.
Сега, когато работи, нека да разгледаме допълнителния код, който добавихте към предишния пример на PyQt5.
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
Това импортира още някои джаджи, които сте използвали в примерите на PyQt5, а именно QLabel, QPushButton и QMessageBox.
def dialog(): mbox = QMessageBox() mbox.setText("Your allegiance has been noted") mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru") mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) mbox.exec_()
Тук сте дефинирали метод с име dialog, който създава изпълним модул за кутия за съобщения и задава някакъв текст на бутоните и другите полета.
Диалоговият метод се извиква от основния блок на програмата, когато се натисне бутон в конкретен уиджет (в този случай btn PushButton). Събитието за щракване, задействано върху този бутон, кара тази функция да се изпълни. Такава функция се нарича слот в Qt и ще научите повече за нея сигнали намлява слотове в следващите параграфи.
if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99")
Това е основната секция на приложението и както в предишния пример, започвате със създаване на екземпляр на QApplication, последван от прост уиджет, т.е. екземпляр на QWidget.
label = QLabel(w) btn = QPushButton(w)
Добавихте две нови джаджи в това приложение: QLabel и QPushButton. QLabel се използва за отпечатване на нередактируем текст или контейнери вътре в изпълним модул, докато QPushButton се използва за създаване на бутон с възможност за кликване.
Критичното нещо, което трябва да забележите тук, е, че когато създавате обекти етикет и btn, вие предавате обекта прозорец (w) на конструкторите на QLabel и QPushButton. Ето как работи влагането в PyQt5. За да създадете уиджет в друг уиджет, предавате препратката на родителския уиджет към конструктора на детето.
label.move(100,130) btn.move(110,150)
move() се използва за задаване на позицията на изпълним модул по отношение на неговия родителски изпълним елемент. В първия случай етикетът ще бъде преместен 100px отляво и 130px от горната част на прозореца.
По същия начин бутонът ще бъде поставен на 110px отляво и 150px от горната част на прозореца. Този пример е груб начин за постигане на оформления и обикновено не се използва в производството; той е включен тук само за учебни цели. Qt поддържа различни оформления, които ще видите подробно в предстоящите раздели на този урок за PyQt.
btn.clicked.connect(dialog)
И накрая, това е пример за сигнали и слотове в Qt. В приложения, базирани на GUI, функциите се изпълняват въз основа на действията, извършвани от потребителя, като задържане на курсора на мишката върху елемент или щракване върху бутон. Тези действия се наричат събития. Спомнете си, че методът app.exec_() прехвърля контрола на Qt Събитие-цикъл. Ето за какво служи цикълът на събитията: да слуша за събития и да извършва действия в отговор.
Всеки път, когато възникне събитие, като потребител, който щракне върху бутон, съответният Qt модул повдига a сигнализира. Тези сигнали могат да бъдат свързани към функции на python (като диалоговата функция в този пример), така че функцията да се изпълнява, когато се задейства сигнал. Тези функции се наричат слотове на езика на Qt.
Впоследствие основният синтаксис за задействане на функция на слот в отговор на сигнала от събитие е както следва
widget.signal.connect(slot)
Което означава, че всеки път, когато a сигнализира се задейства от a джаджа, свързаният слот функцията ще бъде изпълнена. В обобщение, сигналите и слотовете се използват от Qt за комуникация между обекти и улесняване на повторната употреба и интерактивност на компонентите.
След като вече знаете как да влагате уиджети и да реализирате взаимодействия с помощта на сигнали и слотове, ето списък с полезни уиджети и други класове, които можете да използвате във вашите приложения на PyQt.
Компоненти и джаджи
В PyQt има голям брой уиджети за създаване на GUI приложения. Въпреки това, с PyQt5, имаше пренареждане на класове в различни модули и ревизии в лицензите.
Следователно е изключително важно да имате поглед върху структурата на PyQt5 от високо ниво. В този раздел ще видите как PyQt5 е организиран вътрешно и ще научите за различните модули, библиотеки и API класове, предоставени от PyQt5.
PyQt5 структура на директорията
Това са основните модули, използвани от PythonQt свързване, по-специално PyQt5.
- Qt: Комбинира всички класове/модули, споменати по-долу, в един модул. Това значително увеличава паметта, използвана от приложението. Въпреки това е по-лесно да управлявате рамката, като импортирате само един модул.
- QtCore: Съдържа основните неграфични класове, използвани от други модули. Това е мястото, където Qt цикълът на събитията, сигналите и слот-свързването и т.н.
- QtWidgets: Съдържа повечето от наличните джаджи в Pyqt5.
- QtGui: Съдържа GUI компоненти и разширява QtCore модула.
- QtNetwork: Съдържа класове, използвани за внедряване на мрежово програмиране чрез Qt. Той поддържа TCP сървъри, TCP сокети, UDP сокети, SSL обработка, мрежови сесии и DNS търсения.
- QtМултимедия предоставя мултимедийна функционалност на ниско ниво.
- QtSql: реализира интеграция на база данни за SQL бази данни. Поддържа ODBC, MySQL, Oracle, SQLite, и PostgreSQL.
PyQt5 Widgets
Ето списък на най-често използваните джаджи в PyQt5
- QLineEdit: Това е поле за въвеждане, което позволява един ред текст да бъде въведен от потребителя.
line = QLineEdit()
- QRadioButton: Това е поле за въвеждане с бутон за избор, подобно на радио бутоните в html.
rad = QRadioButton("button title") rad.setChecked(True) #to select the button by default.
- QComboBox: Използва се за показване на падащо меню със списък с елементи за избор.
drop = QComboBox(w) drop.addItems(["item one", "item two", "item three"])
- QCheckBox: Показва избираемо квадратно поле пред етикета, който се маркира, ако е избран, подобно на радио бутоните.
check = QCheckBox("button title")
- QMenuBar: показва хоризонтална лента с менюта в горната част на прозорец. Можете да добавяте само обекти от класа QMenu към тази лента. Тези QMenu обекти могат допълнително да съдържат низове, QAction обекти или други QMenu обекти.
- QToolBar: Това е хоризонтална лента или панел, който може да се мести в прозореца. Може да съдържа бутони и други уиджети.
- QTab: използва се за разделяне на съдържанието на прозорец на множество страници, които могат да бъдат достъпни чрез различни раздели в горната част на изпълнимия модул. Състои се от два раздела: лента с раздели и страница с раздели.
- QScrollBar: Използва се за създаване на ленти за превъртане, които позволяват на потребителя да превърта нагоре и надолу в прозореца. Състои се от подвижен плъзгач, пътека за плъзгач и два бутона за превъртане на плъзгача нагоре или надолу.
scroll = QScrollBar()
- QSplitter: Разделителите се използват за разделяне на съдържанието на прозорец, така че джаджите да са групирани правилно и да не изглеждат претрупани. QSplitter е един от основните манипулатори на оформлението, налични в PyQt5 и се използва за разделяне на съдържанието както хоризонтално, така и вертикално.
- QDock: Dock widget е подпрозорец с две свойства:
- Може да се мести в главния прозорец и
- Може да бъде закачен извън родителския прозорец на друго място на екрана.
Оформления и теми
В предишните примери на PyQt5 сте използвали само методите move() и resize(), за да зададете позициите на джаджи във вашия GUI.
PyQt обаче има стабилна машина за управление на оформлението, която може да се използва за създаване на разширени потребителски интерфейси за приложения. В този раздел ще научите за два важни класа, които се използват в Qt за създаване и управление на оформления.
- QBoxоформление
- QGridLayout
QBoxоформление
QBoxОформлението се използва за подравняване на дъщерните модули на оформлението в хоризонтален или вертикален ред. Двата класа на интереси, които наследяват от QBoxОформлението са:
- QHBoxОформление: използва се за подреждане на дъщерните уиджети хоризонтално.
- QVBoxОформление: използва се за вертикално подреждане на дъщерните уиджети.
Например, ето как три бутона са подравнени с QHBoxОформлението ще изглежда.
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() w.setWindowTitle("Musketeers") btn1 = QPushButton("Athos") btn2 = QPushButton("Porthos") btn3 = QPushButton("Aramis") hbox = QHBoxLayout(w) hbox.addWidget(btn1) hbox.addWidget(btn2) hbox.addWidget(btn3) w.show() sys.exit(app.exec_())
И така ще изглеждат в QVBoxLayout.
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() w.setWindowTitle("Musketeers") btn1 = QPushButton("Athos") btn2 = QPushButton("Porthos") btn3 = QPushButton("Aramis") vb = QVBoxLayout(w) vb.addWidget(btn1) vb.addWidget(btn2) vb.addWidget(btn3) w.show() sys.exit(app.exec_())
Единствената функция, която се нуждае от някакво обяснение на този етап, е методът addWidget(). Използва се за вмъкване на джаджи в HBox или VBox оформление. Използва се и в други оформления, където приема различен брой параметри, както ще видите в следващия раздел. Приспособленията ще се появят в оформлението в реда, в който сте ги вмъкнали.
QGridLayout
QGridLayout се използва за създаване на интерфейси, в които уиджетите са разположени под формата на решетка (като матрица или 2D масив). За да вмъкнете елементи в мрежово оформление, можете да използвате матричното представяне, за да определите броя на редовете и колоните в мрежата, както и позицията на тези елементи.
Например, за да създадете мрежа 3*3 (т.е. мрежа с три реда и три колони), ще напишете следния код:
Import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() grid = QGridLayout(w) for i in range(3): for j in range(3): grid.addWidget(QPushButton("Button"),i,j) w.show() sys.exit(app.exec_())
Това ще бъде резултатът:
Методът addWidget() В оформлението на мрежата приема тези аргументи:
- Обектът на притурката, който искате да добавите към мрежата
- X-координатата на обекта
- Y-координатата на обекта
- Обхватът на реда (по подразбиране =0)
- Col-span (по подразбиране=0)
За да го разберете по-добре, можете ръчно да вмъкнете всяка джаджа, както е показано по-долу
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() grid = QGridLayout(w) grid.addWidget(QPushButton("Button one"),0,0) grid.addWidget(QPushButton("Button two"),0,1) grid.addWidget(QPushButton("Button three"),1,0) grid.addWidget(QPushButton("Button four"),1,1) w.show() sys.exit(app.exec_())
Ето как ще изглежда мрежата:
Можете също така да подадете параметрите rowspan и colspan към addWidget(), за да обхванете повече от един ред или колона.
Например,
grid.addWidget(QPushButton("Button five"),2,0,1,0)
Това ще създаде бутон, който се простира върху двете колони.
Теми
PyQt5 идва с някои вградени теми, които можете да използвате във вашите приложения. The setStyle() методът, извикан в екземпляра на QApplication, се използва за задаване на конкретна тема на вашето приложение.
Например, добавянето на следния ред код ще промени темата на вашето приложение от стандартна на Fusion
app.setStyle("Fusion")
Ето как ще изглежда предишният пример във Fusion Theme
Друга полезна функция за тематизиране на вашите приложения е методът setPalette(). Ето кода за промяна на цвета на различни уиджети с помощта на setPalette().
import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import * from PyQt5.QtGui import QPalette if __name__ == "__main__": app = QApplication([]) app.setStyle("Fusion") qp = QPalette() qp.setColor(QPalette.ButtonText, Qt.black) qp.setColor(QPalette.Window, Qt.black) qp.setColor(QPalette.Button, Qt.gray) app.setPalette(qp) w = QWidget() grid = QGridLayout(w) grid.addWidget(QPushButton("Button one"),0,0) grid.addWidget(QPushButton("Button two"),0,1) grid.addWidget(QPushButton("Button three"),1,0) grid.addWidget(QPushButton("Button four"),1,1) w.show() sys.exit(app.exec_())
Ето резултата.
За да използвате метода setPalette(), първо трябва да дефинирате палитра. Това става чрез създаване на обект от класа QPalette.
qp = QPalette()
Забележете, че класът QPalette принадлежи към модула QtGui и ще трябва да го импортирате, за да работи това. След като създадете обекта QPalette, използвайте метода setColor(), за да предадете името на изпълним модул, чийто цвят искате да промените и цвета, който искате да бъде зададен.
qp.setColor(QPalette.Window, Qt.black)
Това ще промени цвета на прозореца на черен. След като сте дефинирали вашата цветова схема, използвайте функцията setPalette(), за да приложите палитрата към вашето приложение.
app.setPalette(qp)
Това е всичко, което трябва да направите, ако искате да създадете някои основни теми за вашето приложение. PyQt също ви позволява да използвате таблици със стилове, за да дефинирате външния вид на вашите джаджи. Ако сте запознати с CSS, можете лесно да дефинирате разширени стилове за вашето приложение с помощта на Qt Style Sheets.
Oбобщение
- PyQt е обвързването на python за C++ UI рамка, Qt.
- PyQt4 и PyQt5 са двете основни версии, разработени от Riverbank Computing.
- Основните модули на рамката PyQt са:
- Qt
- QtCore
- QtWidgets
- QtGui
- QtSql
- QtNetwork
- PyQt поддържа различни джаджи като:
- Копчета
- Текстови етикети
- Текстови полета
- Радио бутони и квадратчета за отметка
- Ленти с инструменти и ленти с менюта
- уеб комплект
- Tabs
- Docks
- В PyQt интерактивността се реализира с помощта на сигнали намлява слотове.
- An събитие е действие, извършвано от потребител в GUI (като щракване върху бутон).
- A сигнализира се повдига от съответния уиджет, когато в него възникне събитие.
- A слот е функция, която е свързана със сигнала и се изпълнява, когато сигналът е повишен.
- PyQt има стабилна система за оформление и поддържа усъвършенстван дизайн и управление на оформлението. Това са две често използвани схеми на оформление в PyQt:
- Box оформление
- Оформление на мрежата
- Дизайнерът на PyQt ви позволява да създавате персонализирани теми за GUI приложение и има вградена поддръжка за листове със стилове.
- qtcreator Python може да се използва за създаване на потребителски интерфейси, както и за самостоятелни приложения.