以下代码是可运行的,您只需复制/粘贴即可:
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()
答案 0 :(得分:2)
全局范围的函数应用于多进程目标函数,因此startProcess()
应该移到全局范围。
此外,在if __name__ == "__main__"
中对startProcess()
的检查将导致if块中的代码无法执行。
最后,应将startingWin
的创建放在if __name__ == "__main__"
块中,否则启动的每个进程都将创建startingWin
。
以下是为解决上述问题而提出的更改建议:
from tkinter import *
import multiprocessing
def startProcess():
clientsWin = Tk()
label = Label(clientsWin, text="Nothing to show")
label.grid()
clientsWin.mainloop()
def createClientsWin():
p = multiprocessing.Process(target=startProcess)
p.start()
if __name__ == '__main__':
startingWin = Tk()
button = Button(startingWin, text="create clients", command=createClientsWin)
button.grid()
startingWin.mainloop()
答案 1 :(得分:1)
与tkinter一起使用多处理时,使用类更容易。尝试以下代码:
import tkinter as Tk
import multiprocessing as mp
class A:
def __init__(self, master):
self.master = master
label = Tk.Label(self.master, text = 'A')
label.pack()
root_b = Tk.Toplevel()
GUI_B = B(root_b)
mp.Process(target = GUI_B.mainloop())
def mainloop(self):
self.master.mainloop()
class B:
def __init__(self, master):
self.master = master
label = Tk.Label(self.master, text = 'B')
label.pack()
def mainloop(self):
self.master.mainloop()
if __name__=='__main__':
root = Tk.Tk()
GUI_A = A(root)
mp.Process(target = GUI_A.mainloop())