pyqt5---在子线程中对进行主窗口ui操作导致界面崩溃

 在 PyQt中,主窗口UI 和 程序中生成的子线程是不同的两个线程,如果在子线程中更新窗体UI 可能会导致应用程序崩溃或报错,所有与主窗口UI相关的操作都应该在主线程中执行。

如果需要在子线程完成某些操作对主窗口进行更新显示或显示修改,可以使用 PyQt 提供的信号和槽机制进行。

1. 首先定义一个信号。

signal_show_item = pyqtSignal(list, name="signal_show_item")

 

2、把信号连接到一个槽函数。

self.signal_show_item.connect(self.show_item)

 

3.定义一个线程函数。

def start_thread_work(func, args=(), kwargs=None):
    if kwargs is None:
        kwargs = dict()
    target = ThreadWithResult(target=func, args=args, kwargs=kwargs)
    target.daemon = True
    target.start()
    return target

 

4.在代码中调用线程函数,开启线程。

如果满足response请求从接口获取到数据,触发信号

    def again_view(self):
        while True:
            start_thread_work(self.check_data)
            # # 等待5秒再次调用ThreadWithResult
            time.sleep(5)
    def check_data(self):
        # 首先查看数据是否存在
        interface = get_map_json_data("./config/config_interface.json")
        url = interface["trigger_event_interface"]
        try:
            # 发送GET请求
            response = requests.get(url, timeout=5)
            if response.status_code == 200:
                # print("发送GET请求")
                # 解析返回的数据(这里返回的是JSON格式)
                data = response.json()
               if data['r'] == 0:
                    self.signal_show_item.emit(data['d'])

5.信号的触发函数会对主界面进行操作。

    def show_item(self, data):
        # data is list []
        newks = []
        # 取出新数据所有k
        for j in data:
            k = j["id"]
            newks.append(k)
        ... ...

这种方法的关键是使用 `pyqtSignal` 来安全地跨线程通信,并确保 GUI 更新始终在主线程中执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值