pyqt5 如何在线程中更新窗口UI

31 篇文章 14 订阅

pyqt5  如何在线程中更新窗口UI

 总所周知窗口UI 和 程序中生成的子线程是不同的两个线程,如果在子线程中更新窗体UI 就会报错:

所以 需要解决这个问题,qt中有个叫信号的东西。可以通过信号(signal)来触发事件,传递消息

建立信号变量

//词句在窗内编写
signal_ListView_set= QtCore.pyqtSignal(str)

更新控件的函数

    #线程更新ListView的工作函数
    def update_listView(self,hosts_list):
        slm = QStringListModel();  # 创建mode
        self.qList.clear()  # 重置清空列表
        for host, status in hosts_list:
            self.qList.append('{0}'.format(host, status))
            print('{0}:{1}'.format(host, status))
        slm.setStringList(self.qList)  # 将数据设置到model
        self.listView.setModel(slm)  ##绑定 listView 和 model

 绑定信号

 self.signal_ListView_set.connect(self.update_listView) #绑定信号

在线程内发射信号执行槽函数。

    #监控实时扫描的线程
    def work_thread(self):
        '''
        :return:
        '''
        nm = nmap.PortScanner()  # instantiate nmap.PortScanner object
        nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389')

        while True:
            time.sleep(0.2) #每隔0.2秒查询一次
            hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
            self.signal_ListView_set.emit(hosts_list)
            if self.g_bExit == True:
                break

结果 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyQt5 UI 界面分为多线程任务可以通过使用 Python 的 `threading` 模块来实现。以下是一个简单的示例代码,演示了如何在 PyQt5 应用程序使用多线程任务: ```python import sys import time import threading from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel class MainWindow(QMainWindow): def __init__(self): super().__init__() self.label = QLabel('Waiting for task to finish...', self) self.setCentralWidget(self.label) self.thread = threading.Thread(target=self.do_task) self.thread.start() def do_task(self): time.sleep(5) # 模拟耗时任务 self.label.setText('Task is finished.') if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在上面的示例代码,我们创建了一个 `MainWindow` 类,它继承自 `QMainWindow`。在 `MainWindow` 的构造函数,我们创建了一个 `QLabel` 对象,并将其设置为窗口小部件。然后,我们创建了一个新的线程对象,并将其目标设置为 `do_task` 方法。最后,我们启动线程。 在 `do_task` 方法,我们模拟了一个耗时任务,即睡眠了 5 秒钟,然后将标签文本设置为“任务已完成”。 当我们运行这个示例代码时,我们会看到一个窗口出现,上面显示着“等待任务完成”的文本。然后,5 秒钟后,文本变为“任务已完成”。在这个过程,我们的应用程序仍然可以响应用户的输入,因为任务正在另一个线程运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值