前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyQt 编程入门(六.3)

PyQt 编程入门(六.3)

作者头像
用户6021899
发布2019-08-14 17:40:06
4490
发布2019-08-14 17:40:06
举报

本篇介绍两种实时自动更新界面的方法。

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_())

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档