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

结果 

 

PyQt5集成UI Automation(UIA)库通常用于跨平台自动化测试,特别是在Windows系统上。由于UIA是Windows的原生技术,要在Python的多线程环境使用它,你需要遵循一些步骤: 1. **安装所需的库**: 首先,确保已经安装了`pywinauto`库,它是PyQt5UIA交互的桥梁。你可以通过pip安装它: ``` pip install pywinauto ``` 2. **导入所需模块**: 在需要使用UIA的线程里,引入`pywinauto`的`Application`类和其他必要的模块。 ```python from PyQt5.QtCore import QThread, pyqtSignal from pywinauto.application import Application ``` 3. **创建线程**: 创建一个新的线程,并在其初始化UIA应用实例。记得使用QThread的信号槽机制来同步主线程和新线程之间的通信。 ```python class UIAThread(QThread): finished_signal = pyqtSignal() def __init__(self): super().__init__() def run(self): self.app = Application() # 在这里执行UIA相关的操作,例如找到窗口、控件等 # ... self.finished_signal.emit() # 发出信号表示任务完成 # 在主线程启动线程并等待 thread = UIAThread() thread.finished_signal.connect(thread.quit) # 连接信号以便关闭线程 thread.start() thread.wait() # 等待线程结束 ``` 4. **处理异常**: 在运行UIA操作时,可能会遇到各种异常,比如找不到指定的元素。因此,应该处理可能出现的异常。 ```python def run_in_thread(): try: # 在run方法添加try-except块 thread.run() except Exception as e: print(f"Error in UIA operation: {e}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值