我有一个模块,该模块调用另一个模块,在该模块中,我使用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会冻结,直到执行结束)。
答案 0 :(得分:1)
好吧
我想,您在Windows上,所以您的问题是当新进程启动时,Python正在pickle
-插入您的模块(或程序包)中的所有代码(这是由于Windows restrictions) >
因此,当您使用多处理模块时,应使用if __name__ == '__main__':
语句。这是为什么的解释:
对代码进行腌制后,它会在另一个进程中运行,并且除__name__
变量之外,其他所有内容都与主进程相同。该变量可以将程序作为主代码保存下来。由于存在此错误,您的程序会清除画布,然后从头开始工作。
答案 1 :(得分:0)
此问题的可能解决方案是使用线程。 Python有一个称为线程的模块。您可以使用此模块创建线程,以便您的tkinter应用程序不会冻结。这就是它的样子。
import threading
def Function(Data):
print(Data)
thread = threading.Thread(target=Function, args=["Hi"], daemon=True).start()
# daemon simply means that the thread will die once done executing.
我们创建一个称为线程的线程。线程将执行该功能。线程将程序分为同时运行的任务。换句话说,这意味着可以同时运行两个或多个任务。同一进程中的线程使用相同的内存和资源,而一个进程则不使用。您还可以使用线程模块在类中创建线程。只需导入线程模块并在类中继承它即可。例如,
import threading
class Animal(threading.Thread):
def __init__(self, v):
threading.Thread.__init__(self, Variable): # init for threaded classes
self.Variable = Variable
self.Run()
def Run(self):
print("I am an animal")
A = Animal("Snake")
A.start()
如果您希望对象在不降低应用程序运行速度的情况下运行并使其崩溃和冻结,则这是一件好事。