【发布时间】:2019-09-19 15:16:49
【问题描述】:
我有一个模块调用另一个模块,我用 tkinter 和一个按钮初始化一个画布。当用户单击按钮时,它会从第一个模块启动一个功能。但是这个函数很长,我不想让 tkinter 冻结,直到函数完全执行。似乎多处理将是解决方案,但我在实施它时遇到了一些困难。
在第一个模块中:
tkinterModule.initialize(functionFromMainModule)
在第二个模块中:
...
button = Button(master,
text="Launch Function",
command=partial(play, callback))
def play(callback=None):
if callback is not None:
callback()
然后在第一个模块中:
def functionFromMainModule():
....
if __name__ == '__main__':
p = multiprocessing.Process(target=longFunction)
p.start()
def longFunction():
...
但不是启动 longFunction 它只是重新初始化一个新的 tkinter 画布并且不启动该函数。如果我只是调用该函数而不使用多处理,则该函数将正常调用(但 tkinter 被冻结直到执行结束)。
【问题讨论】:
-
所有 GUI 都应该在一个线程中。其他线程或进程只应进行计算并将结果或信息发送到将更改 GUI 的主线程。
-
也许可以为您的问题创建最小的工作示例,以便我们运行它。
-
也许你应该运行
if __name__ == '__main__':中的所有代码,而不仅仅是多进程。 -
你在windows上吗?如果是,您应该使用
if __name__ == '__main__'声明
标签: python tkinter python-multiprocessing