总结一下我的问题,我想加载程序的主布局,但同时运行一个后台守护程序来检查数据库中的任务并通知用户。我正在使用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显示所有通知为止。
非常感谢任何想法或帮助,谢谢:)
答案 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
元组中指定这些参数。