常è§GUIæ¡æ¶
PyQt5
[1]
ï¼
Qt
[2]
æ¯ä¸ä¸ªè·¨å¹³å°ç C++å¾å½¢ç¨æ·çé¢åºãQTä¸åº¦è¢«è¯ºåºäºæ¥ï¼ååºå®ç»è¬å
°ç软件å
¬å¸Digia OyjãPyQt5æ¯åºäºDigiaå
¬å¸Qt5çPythonæ¥å£ï¼ç±ä¸ç»Python模åææãPyQt5æ¬èº«æ¥æè¶
è¿620个类å6000å½æ°åæ¹æ³ãå¨å¯ä»¥è¿è¡äºå¤ä¸ªå¹³å°ï¼å
æ¬ï¼Unix, Windows, and Mac OSã
Pyside6
[3]
ï¼Pysideæ¯QTå
¬å¸å®æ¹æä¾çPythonå
ï¼ä¸ä¸çæ¬ä¸ºPyside2ï¼å¯¹åºçæ¯QT5ï¼ææ°çå½åè§åè¿è¡äºè°æ´ï¼æ´æ¹ä¸ºPyside6ï¼å¯¹åºçæ¯QT6çæ¬ãç±äºå®æ¹åºåçæ¯è¾ç好ï¼ç¼ºç¹æ¯åå¸æ¯è¾æï¼ç½ä¸çèµæ没æPyQt5å¤ã
Tkinter
[4]
ï¼Pythonå
ç½®çGUIæ¡æ¶ï¼ä½¿ç¨TCLå®ç°ï¼Pythonä¸å
åµäºTCL解éå¨ï¼ä½¿ç¨å®çæ¶åä¸ç¨å®è£
é¢å¤çæ©å±å
ï¼ç´æ¥importï¼è·¨å¹³å°ãä¸è¶³ä¹å¤å¨äºUIå¸å±å
¨é 代ç å®ç°ï¼åªæ15ç§å¸¸ç¨é¨ä»¶ï¼æ¾ç¤ºææç®éã
PySimpleGUI
[5]
ï¼PySimpleGUI æ¯ Tkinter ä¸å±å
è£
ãä½¿ç¨ PySimpleGUI å®ç°èªå®ä¹ GUI æéç代ç éè¦æ¯ä½¿ç¨ Tkinter ç´æ¥ç¼åç¸åç GUI è¦å°å¾å¤ã
WxPython
[6]
ï¼wxPythonæ¯Pythonè¯è¨å¯¹æµè¡çwxWidgets跨平å°GUIå·¥å
·åºçç»å®ãç¨å¾æ¯è¾å¹¿æ³ï¼è·¨å¹³å°ï¼C++ç¼åï¼ææ¡£å°ï¼ç¨æ·å¯è½å°±éè¦æ ¹æ®ç¼ç¨å
容对ä¸åå¹³å°ä¸çGUI代ç åä¸äºè°æ´ãéå°é®é¢ä¸å¥½è§£å³ï¼ä»£ç å¸å±æ§ä»¶ï¼ä¸ç´è§ã
Wax
[7]
ï¼åºäºwxPython ï¼ä¸ºå
æwxPythonçé®é¢èå¶ä½çä¸ä¸ªå
ã
Kivy
[8]
ï¼ä¸»è¦é对å¤ç¹è§¦æ§ç¨åºï¼æºè½ææºå¹³æ¿çï¼ä¹å¯ä»¥å¨æ²¡æ触å±åè½çç³»ç»ä¸ï¼å
¨å¹³å°æ¯æï¼Windows, Linux, Mac OS X, Android and iOS.ï¼ä½¿ç¨Pythonåcythonç¼åï¼ä¸ææ¯æå·®ï¼éè¦èªå·±ä¸è½½ä¸æåºå¹¶ä¸å¶å®è·¯å¾ã
BeeWare
[9]
ï¼Write once. Deploy everywhere.éè¦ä¸Kivyé
å使ç¨ã
Toga
[10]
ï¼ä¸ä¸ªä½¿ç¨Pythonå¼ååçAPPçGUIå·¥å
·å
ãTogaç±ä¸ä¸ªå
·æå
±äº«æ¥å£çåºç¡ç»ä»¶åºç»æï¼ä»¥ç®åä¸å¹³å°æ å
³çGUIå¼åãTogaéç¨äºMac OSãWindowsãLinuxï¼GTKï¼ä»¥åAndroidåiOSç移å¨å¹³å°ã
Eel
[11]
ï¼ä¸ä¸ªè½»éç Python åºï¼ç¨äºå¶ä½ç®åçç±»ä¼¼äº Electronï¼ä½æ¯æ¯å®æ´è½»éï¼ ç离线 HTML/JS GUI åºç¨ç¨åºï¼å¹¶å
·æ对 Python åè½ï¼capabilitiesï¼ååºçå®å
¨è®¿é®æéã
Flexx
[12]
ï¼ä¸ä¸ªçº¯ Python å·¥å
·å
ï¼ç¨æ¥å建å¾å½¢åçé¢åºç¨ç¨åºãå
¶ä½¿ç¨ Web ææ¯è¿è¡çé¢ç渲æãä½ å¯ä»¥ç¨ Flexx æ¥å建æ¡é¢åºç¨ï¼åæ¶ä¹å¯ä»¥å¯¼åºä¸ä¸ªåºç¨å°ç¬ç«ç HTML ææ¡£ãå 为使ç¨çº¯ Python å¼åï¼æ以 Flexx æ¯è·¨å¹³å°çãåªéè¦æ Python åæµè§å¨å°±å¯ä»¥è¿è¡ã
pywebview
[13]
æ¯å´ç» webview ç»ä»¶çè½»éå跨平å°å
è£
å¨ï¼wrapperï¼ï¼å®å
许å¨å
¶èªå·±çæ¬æº GUI çªå£ä¸æ¾ç¤º HTML å
容ãå®ä½¿æ¨å¯ä»¥å¨æ¡é¢åºç¨ç¨åºä¸ä½¿ç¨ Web ææ¯ï¼åæ¶å°½æ大å¯è½éè使ç¨æµè§å¨æ建GUIçäºå®ã
enaml
[14]
ï¼ä¸ç§è½å¤è®©ä½ ç¨æå°çåªåå°±å¯ä»¥å®ç°é«è´¨éGUIçé¢ççPythonæ¡æ¶ï¼ä¹æ¯ä¸ç§ç¬ç¹çç¼ç¨è¯è¨ãenamlå°å£°ææ§è¯è¨ä¸åºäºçº¦æçå¸å±ç³»ç»ç»åå¨ä¸èµ·ï¼ä½¿ç¨æ·å¯ä»¥è½»æ¾å°å®ä¹çµæ´»å¸å±çUIãenamlåºç¨ç¨åºå¯ä»¥å¨ä»»ä½æ¯æPythonåQtçå¹³å°ä¸è¿è¡ã
个人æ³æ³ï¼å¤ªå¤å¦ä¸å®ï¼å
å¦PyQt5ï¼åå æ¯èµæå¤ï¼å¦æä½ååå¦pyside6ï¼æåçä¸PySimpleGUIï¼çè½å¦è§£å³ä¸äºç®åé®é¢ã
PyQt5ç®ä»
PyQtæ¯Qtæ¡æ¶çPythonè¯è¨å®ç°ï¼ç±Riverbank Computingå¼åï¼æ¯æ强大çGUIåºä¹ä¸ãPyQtæä¾äºä¸ä¸ªè®¾è®¡è¯å¥½ççªå£æ§ä»¶éåï¼æ¯ä¸ä¸ªPyQtæ§ä»¶é½å¯¹åºä¸ä¸ªQtæ§ä»¶ï¼å æ¤PyQtçAPIæ¥å£ä¸QtçAPIæ¥å£å¾æ¥è¿ï¼ä½PyQtä¸å使ç¨QMakeç³»ç»åQ_OBJECTå®ã
PyQt5æä¾GPLçååä¸çè¯ä¹¦ï¼èªç±å¼åè
å¯ä»¥ä½¿ç¨å
è´¹çGPL许å¯ï¼å¦æéè¦å°PyQtç¨äºåä¸åºç¨ï¼åå¿
é¡»è´ä¹°åä¸è®¸å¯ã
PyQt5ç¹æ§å¦ä¸ï¼
åºäºé«æ§è½çQtçGUIæ§ä»¶éã
è½å¤è·¨å¹³å°è¿è¡å¨LinuxãWindowåMac OSç³»ç»ä¸ã
使ç¨ä¿¡å·æ§½æºå¶è¿è¡éä¿¡ã
对Qtåºè¿è¡å®å
¨å°è£
ã
å¯ä»¥ä½¿ç¨æççIDEè¿è¡çé¢è®¾è®¡ï¼å¹¶èªå¨çæå¯æ§è¡çPython代ç ã
æä¾ä¸æ´å¥ç§ç±»é½å
¨ççªå£æ§ä»¶ã
PyQt5æ¯ç±ä¸ç³»åPython模åç»æï¼æè¶
è¿620个类ï¼6000个å½æ°åæ¹æ³ï¼ä¸»è¦æ¨¡åå¦ä¸ï¼
QtCoreï¼å
å«äºæ ¸å¿çé GUI çåè½ã主è¦åæ¶é´ãæ件ä¸æ件夹ãåç§æ°æ®ãæµãURLsãmime ç±»æ件ãè¿ç¨ä¸çº¿ç¨ä¸èµ·ä½¿ç¨ã
QtGuiï¼å
å«äºçªå£ç³»ç»ãäºä»¶å¤çã2D å¾åãåºæ¬ç»ç»ãåä½åæåç±»ã
QtWidgetsï¼å
å«äºä¸ç³»åå建æ¡é¢åºç¨ç UI å
ç´ ã
QtMultimediaï¼å
å«äºå¤çå¤åªä½çå
容åè°ç¨æå头 API çç±»ã
QtBluetoothï¼å
å«äºæ¥æ¾åè¿æ¥èççç±»ã
QtNetworkï¼å
å«äºç½ç»ç¼ç¨çç±»ï¼è¿äºå·¥å
·è½è®© TCP/IP å UDP å¼ååå¾æ´å æ¹ä¾¿åå¯é ã
QtPositioningï¼å
å«äºå®ä½çç±»ï¼å¯ä»¥ä½¿ç¨å«æãWiFi çè³ææ¬ã
Enginioï¼å
å«äºéè¿å®¢æ·ç«¯è¿å
¥å管ç Qt Cloud çç±»ã
QtWebSocketsï¼å
å«äº WebSocket åè®®çç±»ã
QtWebKitï¼å
å«äºä¸ä¸ªåº WebKit2 ç web æµè§å¨ã
QtWebKitWidgetsï¼å
å«äºåºäº QtWidgets ç WebKit1 çç±»ã
QtXmlï¼å
å«äºå¤ç xml çç±»ï¼æä¾äº SAX å DOM API çå·¥å
·ã
QtSvgï¼æä¾äºæ¾ç¤º SVG å
容çç±»ï¼Scalable Vector Graphics (SVG) æ¯ä¸ç§æ¯ä¸ç§åºäºå¯æ©å±æ è®°è¯è¨ (XML)ï¼ç¨äºæè¿°äºç»´ç¢éå¾å½¢çå¾å½¢æ ¼å¼ï¼è¿å¥è¯æ¥èªäºç»´åºç¾ç§ï¼ã
QtSqlï¼æä¾äºå¤çæ°æ®åºçå·¥å
·ã
QtTestï¼æä¾äºæµè¯ PyQt5 åºç¨çå·¥å
·ã
PyQt5çå®è£
ç±äºåæè¦ä½¿ç¨fbsè¿è¡æå
ï¼fbs对Python 3.7以åççæ¬å¯è½åå¨å
¼å®¹é®é¢ï¼æ以æéæ©äºPython 3.6.8è¿è¡äºæ´ä¸ªç¯å¢çæ建ã主è¦å
容为ï¼Python + PyCharm + PyQt5
å®è£
PyQt5
pip install pyqt5 pip install pyqt5-tools
å
¶ä¸pyqt5-tools为Qt Designerææ½å¼ççé¢è®¾è®¡å·¥å
·ãå®è£
è¿ç¨ä¸å¯è½ä¼æ¥å¦ä¸é误ï¼
qt5-tools 5.15.2.1.2 has requirement click~=7.0, but you'll have click 8.0.1 which is incompatible.
解å³æ¹æ¡ï¼
pip install click~=7.0
Qt Designerçé
ç½®
Qt Designer æ¯éè¿ææ½çæ¹å¼æ¾ç½®æ§ä»¶ï¼å¹¶å®æ¶æ¥çæ§ä»¶ææè¿è¡å¿«éUI设计ã
æ´ä¸ªç»é¢çææï¼
左侧çâWidget Boxâå°±æ¯åç§å¯ä»¥èªç±æå¨çç»ä»¶
ä¸é´çâMainWindow â untitledâçªä½å°±æ¯ç»å¸
å³ä¸æ¹çâObject Inspectorâå¯ä»¥æ¥çå½åuiçç»æ
å³ä¾§ä¸é¨çâProperty Editorâå¯ä»¥è®¾ç½®å½åéä¸ç»ä»¶çå±æ§
å³ä¸æ¹çâResource Browserâå¯ä»¥æ·»å åç§ç´ æï¼æ¯å¦å¾çï¼èæ¯çç
æç»çæ.uiæ件ï¼å®è´¨ä¸æ¯XMLæ ¼å¼çæ件ï¼ï¼å¯ç´æ¥ä½¿ç¨ï¼ä¹å¯ä»¥éè¿pyuic5å·¥å
·è½¬æ¢æ.pyæ件ã
QtDisigneré
ç½®
å¨Pycharmä¸ï¼ä¾æ¬¡æå¼ File â Settings â Tools â External Toolsï¼ç¹å» + Create Toolï¼é
ç½®å¦ä¸ï¼
Name: QtDisigner Program : D:\Program Files\Python36\Lib\site-packages\qt5_applications\Qt\bin\designer.exe #Â è¯·æ ¹æ®å®é
ä¿®æ¹ Working directory: $FileDir $
PyUICé
ç½®
PyUIC主è¦æ¯æQt Designerçæç.uiæ件æ¢æ.pyæ件ã
å¨Pycharmä¸ï¼ä¾æ¬¡æå¼ File â Settings â Tools â External Toolsï¼ç¹å» + Create Toolï¼é
ç½®å¦ä¸ï¼
Name: PyUIC Program : D:\Program Files\Python36\python.exe # å½åPythonç®å½ï¼è¯·æ ¹æ®å®é
ä¿®æ¹ Arguments: -m PyQt5.uic.pyuic $FileName $ -o $FileNameWithoutExtension $.py Working directory: $FileDir $
PyRCCé
ç½®
PyRCC主è¦æ¯æç¼åç.qrcèµæºæ件æ¢æ.pyæ件ã
å¨Pycharmä¸ï¼ä¾æ¬¡æå¼ File â Settings â Tools â External Toolsï¼ç¹å» + Create Toolï¼é
ç½®å¦ä¸ï¼
Name: PyRCC Program: D:\Program Files\Python36\pyrcc5.exe # å½årccå·¥å
·ç®å½ï¼è¯·æ ¹æ®å®é
ä¿®æ¹ Arguments: $FileName $ -o $FileNameWithoutExtension $_rc .py Working directory: $FileDir $
PyQt5使ç¨ç¤ºä¾
å建ä¸ä¸ªç©ºç½ççé¢ï¼
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel app = QApplication(sys.argv) win = QMainWindow() win.setGeometry(400, 400, 400, 300) win.setWindowTitle("Pyqt5 Tutorial" ) win.show() sys.exit(app.exec_())
å
¶ä¸ï¼
Qapplication()ï¼æ¯ä¸ªGUIé½å¿
é¡»å
å«ä¸ä¸ªQapplicationï¼argv表示è·åå½ä»¤è¡åæ°ï¼å¦æä¸ç¨è·åï¼åå¯ä»¥ä½¿ç¨[]代æ¿ã
QMainWindow()ï¼ç±»ä¼¼ä¸ä¸ªå®¹å¨ï¼çªå£ï¼ç¨æ¥å
å«æé®ãææ¬ãè¾å
¥æ¡çwidgetsãargæ è¯å¯ä»¥è·åå½ä»¤è¡æ§è¡æ¶çåæ°ã
SetGeometryæ¯ç¨æ¥å®ä¹ QMainWindow() çªå£çå°ºå¯¸ï¼ è¯æ³ï¼setGeometry(x, y, width, height )ï¼å
¶ä¸x,y为å±å¹ä¸çåæ ç¹ã
show()ï¼ç¨æ¥æ¾ç¤ºçªå£
exit(app.exec_())ï¼è®¾ç½®çªå£ä¸ç´è¿è¡æ导使ç¨å
³éæé®è¿è¡å
³é
PyQt5æ¯æç常è§Widgetsæï¼
ä»ä¸å°ä¸ï¼ä»å·¦å°å³ä¾æ¬¡ä¸ºï¼QlabelãQcomboBoxãQcheckBoxãQradioButtonãQpushButtonãQtableWidgetãQlineEditãQsliderãQProgressBar
对äºä½¿ç¨Pyqt5设置ææ¬å
容ï¼æ们使ç¨Qlabelï¼
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel app = QApplication(sys.argv) win = QMainWindow() win.setGeometry(400, 400, 400, 300) win.setWindowTitle("Pyqt5 Tutorial" ) \# Label Text label = QLabel(win) label.resize(200, 100) label.setText("Hi this is Pyqt5" ) label.move(100, 100) win.show() sys.exit(app.exec_())
æé®ä¸äºä»¶ï¼
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton def click():     print ("Hy Button is clicked!" ) app = QApplication(sys.argv) win = QMainWindow() win.setGeometry(400, 400, 400, 300) win.setWindowTitle("Pyqt5 Tutorial" ) \# Button button = QPushButton(win) button.resize(200, 100) button.setText("Hi! Click Me" ) button.move(100, 100) button.clicked.connect(click) win.show() sys.exit(app.exec_())
button.clicked.connect() å¨æé®ç¹å»åæ§è¡ç¹å®çäºä»¶ã
PyQt5å®æ
å®æ项ç®ï¼ç®æç天æ°æ¥è¯¢è½¯ä»¶
1ã使ç¨Qt Designer设计ä¸ä¸ªçé¢
ç¨å°çæ§ä»¶æButton, GroupBox, Label,ComboBox,TextEditï¼åæ¶å®ä¹äºä¸¤ä¸ªæé®queryBtnåclearBtnï¼åå«ç¨æ¥æ¥è¯¢åæ¸
空天æ°æ°æ®ãæ们éè¦ç»å®æ§½å½æ°ï¼æ¹æ³å¦ä¸ï¼
å¨Qt Designerå³ä¸è§éæ© ä¿¡å·/槽ç¼è¾å¨ï¼ç¹å»+å·æ°å¢
åå«éæ©queryBtnåclearBtnï¼éæ©ä¿¡å· clicked(), æ¥æ¶è
Dialog å槽 accept()ï¼ï¼æ§½å½æ°è¿éä¸ç¥éå¦ä½å®ä¹ï¼åæå¨ä»£ç éåè¿è¡ä¿®æ¹ï¼
以ä¸å®æåä¿å为Weather.uiæ件ã
2ã转æ¢.uiæ件为.pyæ件
PyQt5æ¯æç´æ¥ä½¿ç¨.uiæ件ï¼
import sys from PyQt5 import QtWidgets, uic app = QtWidgets.QApplication(sys.argv) window = uic.loadUi("mainwindow.ui" ) window.show() app.exec()
ä½æ¯ä¸ºäºæ´å¥½çèªå®ä¹åä¿®æ¹ä¸é¢ç槽å½æ°ï¼å¯ä»¥ä½¿ç¨External Tools â PyUICï¼å³å¯çæWeather.pyï¼å®é
è¿è¡å½ä»¤å¦ä¸ï¼
D:\Program Files\Python36\python.exe -m PyQt5.uic.pyuic Weather.ui -o Weather.py
å
¶ä¸ï¼æ们éè¦æ两个æé®ç»å®ç槽å½æ°ï¼
\# self.queryBtn.clicked.connect(Dialog.accept) \# self.clearBtn.clicked.connect(Dialog.accept) \# 修æ¹ä¸ºï¼ self.queryBtn.clicked.connect(Dialog.queryWeather) self.clearBtn.clicked.connect(Dialog.clearText)
æç»çWeather.pyå
容å¦ä¸ï¼
\# -*- coding: utf-8 -*- \# Form implementation generated from reading ui file 'Weather.ui' \# \# Created by: PyQt5 UI code generator 5.15.4 \# \# WARNING: Any manual changes made to this file will be lost when pyuic5 is \# run again.  Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Dialog(object):     def setupUi(self, Dialog):         Dialog.setObjectName("Dialog" )         Dialog.resize(600, 600)         self.groupBox = QtWidgets.QGroupBox(Dialog)         self.groupBox.setGeometry(QtCore.QRect(30, 20, 551, 511))         self.groupBox.setObjectName("groupBox" )         self.label_2 = QtWidgets.QLabel(self.groupBox)         self.label_2.setGeometry(QtCore.QRect(20, 30, 31, 16))         self.label_2.setObjectName("label_2" )         self.comboBox = QtWidgets.QComboBox(self.groupBox)         self.comboBox.setGeometry(QtCore.QRect(70, 30, 87, 22))         self.comboBox.setObjectName("comboBox" )
        self.comboBox.addItem("" )         self.comboBox.addItem("" )         self.comboBox.addItem("" )         self.textEdit = QtWidgets.QTextEdit(self.groupBox)         self.textEdit.setGeometry(QtCore.QRect(20, 70, 491, 411))         self.textEdit.setObjectName("textEdit" )         self.queryBtn = QtWidgets.QPushButton(Dialog)         self.queryBtn.setGeometry(QtCore.QRect(490, 560, 93, 28))         self.queryBtn.setObjectName("queryBtn" )         self.clearBtn = QtWidgets.QPushButton(Dialog)         self.clearBtn.setGeometry(QtCore.QRect(30, 560, 93, 28))         self.clearBtn.setObjectName("clearBtn" )         self.retranslateUi(Dialog)         self.clearBtn.clicked.connect(Dialog.clearText)         self.queryBtn.clicked.connect(Dialog.queryWeather)         QtCore.QMetaObject.connectSlotsByName(Dialog)     def retranslateUi(self, Dialog):         _translate = QtCore.QCoreApplication.translate         Dialog.setWindowTitle(_translate("Dialog" , "Dialog" ))         self.groupBox.setTitle(_translate("Dialog" , "åå¸å¤©æ°é¢æ¥" ))         self.label_2.setText(_translate("Dialog" , "åå¸" ))         self.comboBox.setItemText(0, _translate("Dialog" , "å京" ))         self.comboBox.setItemText(1, _translate("Dialog" , "èå·" ))         self.comboBox.setItemText(2, _translate("Dialog" , "ä¸æµ·" ))         self.queryBtn.setText(_translate("Dialog" , "æ¥è¯¢" ))         self.clearBtn.setText(_translate("Dialog" , "æ¸
空" ))
3ãè°ç¨MainDialog
å¨MainDialogä¸è°ç¨çé¢ç±»Ui_Dialogï¼ç¶åå¨å
¶ä¸ä¸æ·»å æ¥è¯¢å¤©æ°çä¸å¡é»è¾ä»£ç ï¼è¿æ ·å°±åå°äºçé¢æ¾ç¤ºåä¸å¡é»è¾çå离ãæ°å¢demo.pyæä»¶ï¼ å¨MainDialogç±»ä¸å®ä¹äºä¸¤ä¸ªæ§½å½æ°queryWeather()åclearText(),以便å¨çé¢æ件Weather.uiä¸å®ä¹ç两个æé®(queryBtn åclearBtn) 触åclicked ä¿¡å·ä¸è¿ä¸¤ä¸ªæ§½å½æ°è¿è¡ç»å®ã
å®æ´ä»£ç å¦ä¸ï¼
import sys import Weather from PyQt5.QtWidgets import QApplication, QDialog import requests class MainDialog(QDialog):     def __init__(self, parent=None):         super(QDialog, self).__init__(parent)         self.ui = Weather.Ui_Dialog()         self.ui.setupUi(self)     def queryWeather(self):         cityName = self.ui.comboBox.currentText()         cityCode = self.getCode(cityName)         r = requests.get(             "https://restapi.amap.com/v3/weather/weatherInfo?key=f4fd5b287b6d7d51a3c60fee24e42002&city={}" .format(                 cityCode))         if  r.status_code == 200:             data = r.json()['lives' ][0]             weatherMsg = 'åå¸ï¼{}\n天æ°ï¼{}\n温度ï¼{}\né£åï¼{}\né£åï¼{}\n湿度ï¼{}\nåå¸æ¶é´ï¼{}\n' .format(                 data['city' ],                 data['weather' ],                 data['temperature' ],                 data['winddirection' ],                 data['windpower' ],                 data['humidity' ],                 data['reporttime' ],             )         else :             weatherMsg = '天æ°æ¥è¯¢å¤±è´¥ï¼è¯·ç¨ååè¯ï¼'         self.ui.textEdit.setText(weatherMsg)     def getCode(self, cityName):         cityDict = {"å京" : "110000" ,                     "èå·" : "320500" ,                     "ä¸æµ·" : "310000" }         **return ** cityDict.get(cityName, '101010100' )     def clearText(self):         self.ui.textEdit.clear()if  __name__ == '__main__' :     myapp = QApplication(sys.argv)     myDlg = MainDialog()     myDlg.show()     sys.exit(myapp.exec_())
è¿è¡demo.py并æ§è¡æ¥è¯¢åçææï¼
4ãå°ä»£ç æå
æexeæ件
å°.pyæ件æå
æå¯æ§è¡çexeå¨Pythonä¸ç§°ä¸ºfreezingï¼å¸¸ç¨çå·¥å
·æï¼PyInstaller, py2exe, cx_Freeze, bbfreze, py2appçãåè½å¯¹æ¯ï¼
py2exeï¼è½¯ä»¶æ´æ°å·²ç»ä¸æ´»è·ï¼å æ¤ä¹å°±ç¥è¿ã
pyinstallerï¼æç¡®æ¯æwin8ãwin10ãç论ä¸æ¯æwin7,ï¼æ¯æapple Macos, linuxãpyinsallerå¯ä»¥æå
ææ件夹形å¼å
å«exeå
¥å£æ§è¡æ件çå½¢å¼ï¼ä¹å¯ä»¥æ¯ä¸ä¸ªåç¬çexeæ件ã
fbs
[15]
ï¼åºäºPyInstallerï¼ä½¿ç¨èµ·æ¥æ´å æ¹ä¾¿
è¿ééæ©äºfbsæ¥æå
ãfbsçå®è£
æ¹æ³ï¼
pip install fbs
使ç¨æ¹æ³ï¼å¨å½ä»¤è¡ä¸è¾å
¥ï¼
fbs startproject
æ§è¡å®æåéè¦è¾å
¥ä¸äºAPPçå称çãå®æåä¼çæå¦ä¸ç®å½ï¼
å°åæç¼åçPyQt5ç代ç ï¼demo.pyåWeather.pyï¼æå°src/main/pythonæ件夹ä¸ï¼å é¤åæçmain.pyï¼å¹¶å°demo.pyä¿®æ¹ä¸ºmain.pyãç¶åæå¼ main.pyï¼å¨æ件头é¨æ·»å å¦ä¸ä»£ç ï¼
from fbs_runtime.application_context.PyQt5 import ApplicationContext
å®æåæ§è¡ï¼
fbs freeze
å³å¯å®ç°æå
ãçæçexeå¯æ§è¡æ件å¨\target\MyAppæ件ä¸ã
åèèµæ
[1]
PyQt5:
https://riverbankcomputing.com/software/pyqt/intro
[2]
Qt:
https://www.qt.io/
[3]
Pyside6:
https://doc.qt.io/qtforpython/index.html
[4]
Tkinter:
https://wiki.python.org/moin/TkInter
[5]
PySimpleGUI:
https://github.com/PySimpleGUI/PySimpleGUI
[6]
WxPython:
https://wxpython.org/
[7]
Wax:
https://pypi.org/project/wax/
[8]
Kivy:
https://kivy.org/#home
[9]
BeeWare:
https://beeware.org/
[10]
Toga:
https://github.com/pybee/toga
[11]
Eel:
https://github.com/ChrisKnott/Eel
[12]
Flexx:
https://github.com/zoofIO/flexx
[13]
pywebview:
https://github.com/r0x0r/pywebview/
[14]
enaml:
https://github.com/nucleic/enaml
[15]
fbs:
https://build-system.fman.io/pyqt5-tutorial