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

Unable to run background thread and loading wx GUI at the same time

总结一下我的问题,我想加载我的程序主布局,但同时 运行 一个后台守护进程来检查数据库中的任务并通知用户。我正在使用 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 函数。当您真正打算传递函数本身时,您实际传递的是 return 值。

而不是这个:

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模块会为你调用你的函数,所以注意不要自己调用。如果您需要使用参数调用它,请在 Thread class 初始值设定项的 args 元组中指定这些参数。