本篇介绍两种实时自动更新界面的方法。
1.使用QTimer类(计时器)。用法详见代码和注释:
from PyQt5.QtCore import QTimer from PyQt5.QtWidgets import * import sys
class TestWindow(QDialog): def __init__(self): super().__init__() btn1 = QPushButton("Start", self) btn2 = QPushButton("Stop", self) self.sec_label = QLabel(self)
layout = QGridLayout(self) layout.addWidget(btn1,0,0) layout.addWidget(btn2,0,1) layout.addWidget(self.sec_label,1,0,1,2)
timer = QTimer()#创建计时器 timer.timeout.connect(self.update) # 计时器超时信号连接到用于更新界面的槽 btn1.clicked.connect(lambda :timer.start(1000))#每1000ms发射超时信号 btn2.clicked.connect(timer.stop)#暂停计时器 self.sec = 0#
def update(self): self.sec_label.setText(str(self.sec)) self.sec += 1
app=QApplication(sys.argv) form=TestWindow() form.show() app.exec_()
2.使用QThread类创建多线程,使用子线程实时处理数据,最后将结果显示到界面上,可以处理相对复杂一点的逻辑。用法详见代码和注释:
from PyQt5.QtCore import * from PyQt5.QtWidgets import * import sys
class Test(QDialog):#自定义对话框 def __init__(self,parent=None): super().__init__(parent) self.file_list = QListWidget() self.btn1 = QPushButton('Start') self.btn2 = QPushButton('Stop') layout = QGridLayout(self) layout.addWidget(self.file_list,0,0,1,2) layout.addWidget(self.btn1,1,0) layout.addWidget(self.btn2,1,1) self.thread = Worker() self.thread.file_changed_signal.connect(self.update_file_list) self.btn1.clicked.connect(self.thread_start) self.btn2.clicked.connect(self.thread_stop) def update_file_list(self, file_inf): self.file_list.addItem(file_inf) scrollbar =self.file_list.verticalScrollBar() scrollbar.setValue(scrollbar.maximum())#调整滚动条滑块位置
def thread_start(self): self.btn1.setEnabled(False)#是按钮1失活(不能被点击) self.thread.start()#实质是调用线程的 run 方法
def thread_stop(self): self.btn1.setEnabled(True)#激活按钮1 self.thread.terminate()#停掉线程 def closeEvent(self,event): self.thread.terminate()#结束后台进程 event.accept()#接受关闭 class Worker(QThread): file_changed_signal = pyqtSignal(str) # 信号参数类型:str def __init__(self, sec=0, parent=None): super().__init__(parent) self.working = True self.sec = sec
def __del__(self): self.working = False self.wait()
def run(self): while self.working == True: self.sec += 1 self.file_changed_signal.emit('当前秒数:{}'.format(self.sec)) #三种等待方法都可以: #self.sleep(1) #参数须为int,单位秒 self.msleep(1000) #参数须为int,单位毫秒 #import time; time.sleep(1.0)#参数为float,单位秒 app = QApplication(sys.argv) dlg = Test() dlg.show() sys.exit(app.exec_())
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!