PyQt5开发上位机
记录使用PyQt5写上位机的过程
安装
pip install PyQt5
pip install PyQt5-tools
安装tools是为了使用Qt-Designer(允许使用屏幕窗体和简单的拖放界面设计小部件、对话框或完整的主窗口)
在...\Python\Python37\Lib\site-packages\qt5_applications\Qt\bin 目录下可以找到 designer.exe
使用 Qt-Designer:
打开designer.exe,创建widget类对象,拖动摆放控件,做出初始界面(并固定窗口大小),保存成 .ui 文件
生成UI初始化代码
运行命令 pyuic5 -o xxx.py xxx.ui 生成 xxx.py文件,里面有UI的初始化代码
引用初始化代码来生成窗口:
from PyQt5.QtWidgets import QWidget from xxx import Ui_widget class Upper(QWidget, Ui_widget): def __init__(self): super(QWidget, self).__init__() self.setupUi(self) self.show()
if __name__ == '__main__': app = QApplication(sys.argv) ex = Upper() sys.exit(app.exec_())
之后再自定义控件的属性、动作、信号等,这样就简化了很多布局控件的工作
多线程实现:
'''定义子线程''' class thread_1(QThread): beam_signal = pyqtSignal(str) #定义信号 kill_flag = True #采用标志位方便结束死循环子线程 def __init__(self): super(thread_1, self).__init__() '''实现run方法,线程开启后自动执行该方法''' def run(self): while self.kill_flag: self.mechine_signal.emit('xxxxx') #信号发射 class Upper(QWidget, Ui_widget): def __init__(self): super(QWidget, self).__init__() self.notice1 = thread_1() # 创建子线程实例 self.notice1.beam_signal.connect(self.display) #将信号连接到槽 self.notice1.start() #开启子线程 def display(self, msg: str=''): self.textBrowser.setText(msg) # 要结束该子线程,将 kill_flag 置为 False