【发布时间】:2019-08-06 06:15:21
【问题描述】:
以下代码是可运行的,你可以复制/粘贴:
from tkinter import *
import multiprocessing
startingWin = Tk()
def createClientsWin():
def startProcess():
clientsWin = Tk()
label = Label(clientsWin, text="Nothing to show")
label.grid()
clientsWin.mainloop()
if __name__ == "__main__":
p = multiprocessing.Process(target=startProcess)
p.start()
button = Button(startingWin, text="create clients", command=lambda: createClientsWin())
button.grid()
startingWin.mainloop()
所以我只想使用多处理创建一个完全分离的Tk() 窗口。当我单击创建按钮时,我只得到原始窗口(不是预期的窗口),它给了我这个错误:
AttributeError: Can't pickle local object 'createClientsWin.<locals>.startProcess'
*有人能解释一下如何使用多处理启动一个单独的新 Tk() 窗口吗? *
更新:不是重复的
即使我遵循可能重复的问题中提供的解决方案,这也无助于解决我的问题。仅仅因为在我的案例中使用了 Tkinter。修改后的代码:
def createClientsWin():
clientsWin = Tk()
label = Label(clientsWin, text="Nothing to show")
label.grid()
clientsWin.mainloop()
def createClientsWinProcess():
if __name__ == "__main__":
p = multiprocessing.Process(target=createClientsWin)
p.start()
startingWin = Tk()
button = Button(startingWin, text="create clients", command=lambda: createClientsWinProcess())
button.grid()
startingWin.mainloop()
【问题讨论】:
-
@CommonSense 不是重复的。请检查上面的编辑。
-
您的最终目标是什么?根据操作系统,可能无法在分叉进程中运行 Tk(这就是多处理所做的)。
-
@AKX 操作系统是 Win7。 Win7可以吗?
-
你应该把
startProcess()移到createClientsWin()之外,去掉if __name__ == "__main__"里面createClientsWin()的检查。最后在创建startingWin之前添加检查if __name__ == "__main__"。
标签: python python-3.x tkinter multiprocessing