Pyqt5-线程-计时器错误。从单独的线程调用pyqt函数会产生错误

时间:2018-10-12 09:22:25

标签: python multithreading pyqt pyqt5

此程序是围绕从系统任务栏应用程序获取功能而构建的。 该脚本在启动时不执行任何操作,但是当单击名为“登录”的菜单项时,该脚本将运行以下代码,并建立单独的API对象

class loginSTT(threading.Thread):

    def __init__(self):
        # threading.Thread.__init__(self, *args, **kwargs)
        super(loginSTT, self).__init__()
        self.daemon = True
        self.start()

    def run(self):
        global STTApi_instance
        STTApi_instance = STTApi()
        mainWin.SendTrayMessage("Logged in", "Login was successful")
        mainWin.login_action.setVisible(False)
        RefreshLoop()

那部分效果很好。程序不输出错误。然后,该程序在调用Refreshloop()时开始其原始用途。 Eveyr 5分钟后,它在此API实例内部ping一个函数,收集新数据进行分析。但是,这会导致计时错误。

class RefreshLoop(threading.Thread):

    def __init__(self):
        # threading.Thread.__init__(self, *args, **kwargs)
        super(RefreshLoop, self).__init__()
        self.daemon = True
        self.start()

    def run(self):
        while True:
            data = STTApi_instance.RefreshVoyage()
            if 'dilemmaname' in data['Dilemma']:
                mainWin.DilemmaResolution(data['Dilemma'])
                return
            mainWin.SendTrayMessage("No dilemma", f"Remaining Dilithium: {data['voyage_hp']}")
            STTApi_instance.RecallVoyage()
            sleep(300)

而且我相信是运行睡眠的线程的组合,同时调用函数“ mainWin.SendTrayMessage”会产生错误,因为这是我在主gui类中编写的函数,它简化了任务栏的发送警报,该代码如下所示:

def SendTrayMessage(self, topic="", body=""):
    self.tray_icon.showMessage(
        f"{topic}",
        f"{body}",
        QSystemTrayIcon.Information,
        1000)

0 个答案:

没有答案