总结一下我的问题,我想要加载我的程序主布局,但同时运行一个后台守护进程来检查数据库中的任务并通知用户。我使用wx.CallAfter在线程中执行守护进程,但是在加载程序时,图形用户界面会冻结,直到线程处理所有通知,然后加载==,它不会在后台运行。
基本上我尝试的是:-在线程中运行脚本-使用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只是冻结,直到运行守护进程显示所有通知。
非常感谢您的任何想法或帮助,谢谢您:)
发布于 2019-03-25 03:15:00
它挂起是因为当您将其传递给线程时,实际上正在启动rundaemon
函数。当你真正想要传递函数本身的时候,你实际传递的是返回值。
而不是这样:
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
类初始值设定项的args
元组中指定这些参数。
https://stackoverflow.com/questions/55327346
复制相似问题