Pyqt5信号与槽结合多线程实时刷新数据到文本框

Pyqt5信号与槽结合多线程实时刷新数据到文本框

在网上搜索过挺多资料的但对于pyqt5的实时刷新数据到UI窗口的还是比较少人写的, 在本片文章中, 我们会结合信号与槽、多线程的知识来定制一款属于你自己的动态刷新数据程序

首先, 我们先来看下程序实际演示后拆分为一个个小步骤

在这里插入图片描述

  • 当开始单击**"“启动时间”“按钮, 当前时间会以追加的形式添加在文本框中, 按钮文本变化为"关闭连接”**
  • 当单击’'关闭连接"按钮后, 则文本不会继续输出, 按钮变化为**“重新启动”**
  • 单击重新启动后,则会重新以每一秒一次的形式追加数据

OK, 既然我们已经知道了这里面的步骤了,让我们一步步拆分为小目标

  1. 创建程序窗口, 并设计好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_())
  1. 为要发送信号的线程单独创建一个类去继承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)
  1. 当单击按钮后, 第一次为"开启", 第二次为"关闭",第三次为"开启"… 这里可以在custom_window类中创建一个变量值为0,点击一次加一
  2. 然后再判断开启的代码块中发送连接信号并启动多线程, 在判断关闭的代码块中发送关闭的信号
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以上就算是编写好了

  • 5
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
PyQt5中,信号是用于对象间通信的机制。当一个对象的状态发生改变时,它会发出一个信号,其他对象可以通过连接该信号来接收该信号并做出响应。是一个函数,当一个信号被发出时,它会被调用执行。 在信号的连接过程中,可以传递参数。当信号发出时,它可以附带一些数据,这些数据可以在函数中进行处理。传递参数的方式有多种,以下是其中的两种方式: 1. 使用lambda表达式: ```python import sys from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton class Signal(QObject): signal = pyqtSignal(int) class Slot(QObject): def __init__(self): super().__init__() def handle(self, num): print('slot received:', num) if __name__ == '__main__': app = QApplication(sys.argv) signal = Signal() slot = Slot() signal.signal.connect(lambda num: slot.handle(num)) signal.signal.emit(1) sys.exit(app.exec_()) ``` 2. 使用functools.partial: ```python import sys from functools import partial from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton class Signal(QObject): signal = pyqtSignal(int) class Slot(QObject): def __init__(self): super().__init__() def handle(self, num, text): print('slot received:', num, text) if __name__ == '__main__': app = QApplication(sys.argv) signal = Signal() slot = Slot() signal.signal.connect(partial(slot.handle, text='hello')) signal.signal.emit(1) sys.exit(app.exec_()) ``` 以上两种方式都可以在函数中接收到附带的参数。如果你还有其他相关问题,请随时问我。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值