目前主流的gui库有3个: tkinter, wxpython, pyqt5 关于其的争论在这里 回想起之前被tkinter按在地上摩擦, 为了为数不多的头发, 决定从PyQt5重新开始
官方tutorial的hello world如下:
#装好anaconda之后似乎就已经有了 !pip install PyQt5==5.9.2 from PyQt5.QtWidgets import QApplication, QLabel app = QApplication([]) label = QLabel('Hello World!') label.show() app.exec_()控件是GUI的主要组成成分, 官方tutorial的控件集示例:
1.2 可以看出, 消息的绑定主要通过构造函数与connect()实现, 与其他语言一致
这个是最简单的
之前的用例, 在ipython中执行且关闭后, 会遇到ipython不能继续工作的bug.后在这里找到了解决方案:
通过某种方式调用app.quit()即可综合改进的用例:
#pyqtdemo1.py from PyQt5.QtWidgets import * app = QApplication([]) window = QWidget() layout = QVBoxLayout() button = QPushButton('Click') button2 = QPushButton('close') layout.addWidget(button) layout.addWidget(button2) def on_button_clicked(): alert = QMessageBox() alert.setText('You clicked the button!') alert.exec_() def on_exit(): # sys.exit(app.exec_()) #无效 app.quit() button.clicked.connect(on_button_clicked) button2.clicked.connect(on_exit) window.setLayout(layout) window.show() app.exec_()之后可以在dist文件夹下找到pyqtdemo1.exe并执行, 由于包含大量dll文件, 整个程序大的离谱(132MB) 此外, 将import *转化为import a,b,c之后, 程序依然为132MB, 与是否import *没有关系 但与cpp程序相比, 如果不去做迁移适配的话, 整个gui程序只有2KB, 这大概就是优势所在
在官方的pyqt5 tutorial中采用fbs来打包程序
pip install fbs fbs startproject fbs run之后可以通过修改 src/main/python/main.py 来改变GUI 值得注意的是, 在这里fbs中引入的ApplicationContext()起到了QApplication([])的作用,在原先代码基础上需作相应替换
#main.py from fbs_runtime.application_context.PyQt5 import ApplicationContext from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QPushButton, QMessageBox, QWidget import sys if __name__ == '__main__': appctxt = ApplicationContext() # 1. Instantiate ApplicationContext window = QWidget() layout = QVBoxLayout() button = QPushButton('Click') button2 = QPushButton('close') layout.addWidget(button) layout.addWidget(button2) def on_button_clicked(): alert = QMessageBox() alert.setText('You clicked the button!') alert.exec_() def on_exit(): # sys.exit(app.exec_()) #无效 window.destroy() exit_code = appctxt.app.exec_() # 2. Invoke appctxt.app.exec_() sys.exit(exit_code) button.clicked.connect(on_button_clicked) button2.clicked.connect(on_exit) window.setLayout(layout) window.show() exit_code = appctxt.app.exec_() # 2. Invoke appctxt.app.exec_() sys.exit(exit_code)之后执行fbs freeze即可…本该是这样的 重新试了下demo, 依旧卡在fbs freeze, 离谱
