Pyqt5信号与槽结合多线程实时刷新数据到文本框
在网上搜索过挺多资料的但对于pyqt5的实时刷新数据到UI窗口的还是比较少人写的, 在本片文章中, 我们会结合信号与槽、多线程的知识来定制一款属于你自己的动态刷新数据程序
首先, 我们先来看下程序实际演示后拆分为一个个小步骤
- 当开始单击**"“启动时间”“按钮, 当前时间会以追加的形式添加在文本框中, 按钮文本变化为"关闭连接”**
- 当单击’'关闭连接"按钮后, 则文本不会继续输出, 按钮变化为**“重新启动”**
- 单击重新启动后,则会重新以每一秒一次的形式追加数据
OK, 既然我们已经知道了这里面的步骤了,让我们一步步拆分为小目标
- 创建程序窗口, 并设计好UI界面, 这里需要一个文本框、按钮
class custom_window(QDialog):
sum = 0
def __init__(self):
# 子类构造器调用父类的构造器有两种方式:
# 1、父类名.__init__(self)
# 2、super.__init__(self)
QDialog.__init__(self)
self.init_ui()
def init_ui(self):
# 设置主窗口大小
self.setGeometry(500, 1000, 500, 500)
# 设置窗口名称
self.setWindowTitle("时间流逝")
# 创建文本框
self.text_edit = QTextEdit()
# 创建按钮
self.switch_btn = QPushButton()
self.switch_btn.setText("启动时间")
# 创建垂直布局
self.v_layout = QVBoxLayout(self)
# 将按钮与文本框添加到垂直布局
self.v_layout.addWidget(self.text_edit)
self.v_layout.addWidget(self.switch_btn)
if __name__ == "__main__":
# 每个Qt的GUI程序必须的类, sys.argv表示空列表
app = QApplication(sys.argv)
# 创建窗口实例
main_win = custom_window()
# 展示窗口
main_win.show()
# 关闭窗口
sys.exit(app.exec_())
- 为要发送信号的线程单独创建一个类去继承QThread, 并以循环的形式发送信号
class my_thread(QThread):
send_signal = pyqtSignal(str)
def run(self):
while True:
date = QDateTime.currentDateTime()
current_time = date.toString("yyyy-MM-dd hh:mm:ss")
self.send_signal.emit(current_time)
time.sleep(1)
- 当单击按钮后, 第一次为"开启", 第二次为"关闭",第三次为"开启"… 这里可以在
custom_window
类中创建一个变量值为0,点击一次加一 - 然后再判断开启的代码块中发送连接信号并启动多线程, 在判断关闭的代码块中发送关闭的信号
class custom_window(QDialog):
sum = 0
def __init__(self):
# 子类构造器调用父类的构造器有两种方式:
# 1、父类名.__init__(self)
# 2、super.__init__(self)
QDialog.__init__(self)
self.init_ui()
def init_ui(self):
# 设置主窗口大小
self.setGeometry(500, 1000, 500, 500)
# 设置窗口名称
self.setWindowTitle("时间流逝")
# 创建文本框
self.text_edit = QTextEdit()
# 创建按钮
self.switch_btn = QPushButton()
self.switch_btn.setText("启动时间")
# 创建垂直布局
self.v_layout = QVBoxLayout(self)
# 将按钮与文本框添加到垂直布局
self.v_layout.addWidget(self.text_edit)
self.v_layout.addWidget(self.switch_btn)
self.total_signal()
def total_signal(self):
# 实例化线程类
self.myThread = my_thread()
# 单击按钮, 以单击为发送信号
self.switch_btn.clicked.connect(self.on_clicked)
# 单击按钮的槽
def on_clicked(self):
self.sum+=1
if self.sum % 2 == 0:
self.myThread.send_signal.disconnect(self.switch_slot)
self.switch_btn.setText("重新启动")
else:
self.myThread.send_signal.connect(self.switch_slot)
self.switch_btn.setText("关闭连接")
self.myThread.start()
# 连接信号的槽
def switch_slot(self, text):
# 追加文本到文本框
self.text_edit.append(text)
OK以上就算是编写好了