无法同时运行后台线程和加载wx GUI

时间:2019-03-24 18:55:01

标签: python wxpython python-multithreading

总结一下我的问题,我想加载程序的主布局,但同时运行一个后台守护程序来检查数据库中的任务并通知用户。我正在使用wx.CallAfter在线程中执行守护程序,但是在加载程序时,GUI冻结,直到线程处理所有通知,然后加载==,它不会在后台运行。

基本上我尝试的是: -在线程中运行脚本 -使用CallAfter方法

运行线程

这是我的大型机的一部分(仅部分内容过大):

[code]
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "ICSOFT", size = (1400,700))

[...]
    wx.CallAfter(notdaemon)

[...]
def notdaemon():
    import notdaemon
    thread = threading.Thread(target=notdaemon.rundaemon(None), args=())
    thread.daemon = True
    thread.start()


# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

这是notdaemon的摘录:

def rundaemon(self):
    for i, a in reminders.items():
        [...]
        notwin = wx.adv.NotificationMessage(u'test', message=msg, parent=None, flags=wx.ICON_INFORMATION)
        notwin.Show()
        time.sleep(5.5)

因此GUI只会冻结,直到rundaemon显示所有通知为止。

非常感谢任何想法或帮助,谢谢:)

1 个答案:

答案 0 :(得分:0)

它正在挂起,因为实际上在将rundaemon函数传递给Thread时,它们是开始。当您真正打算传递函数本身时,实际上要传递的是返回值。

代替此:

thread = threading.Thread(target=notdaemon.rundaemon(None), args=())

尝试一下:

# notice the `rundaemon` function hasn't been called yet (parentheses have been removed)
thread = threading.Thread(target=notdaemon.rundaemon, args=())

Thread模块将为您调用函数,因此请注意不要自己调用它。如果需要使用参数调用它,请在args类初始化程序的Thread元组中指定这些参数。