Python 如何使用多处理启动单独的新Tk()窗口?
以下代码是可运行的,您只需复制/粘贴即可:Python 如何使用多处理启动单独的新Tk()窗口?,python,python-3.x,tkinter,multiprocessing,Python,Python 3.x,Tkinter,Multiprocessing,以下代码是可运行的,您只需复制/粘贴即可: from tkinter import * import multiprocessing startingWin = Tk() def createClientsWin(): def startProcess(): clientsWin = Tk() label = Label(clientsWin, text="Nothing to show") label.grid() cl
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:无法pickle本地对象“createClientsWin..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()
在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())
在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())
全局范围内的函数应用于多进程目标函数,因此startProcess应移到全局范围内 此外,在startProcess中检查if _uname _u==\u_umain _uu将导致if块中的代码无法执行 最后,startingWin的创建应该放在if\uuuu name\uuuuu==\uuuuu main\uuuu块中,否则启动的每个进程都将创建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()
全局范围内的函数应用于多进程目标函数,因此startProcess应移到全局范围内 此外,在startProcess中检查if _uname _u==\u_umain _uu将导致if块中的代码无法执行 最后,startingWin的创建应该放在if\uuuu name\uuuuu==\uuuuu main\uuuu块中,否则启动的每个进程都将创建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()
@CommonSense的可能副本不是副本。请检查上面的编辑。你的最终目标是什么?根据操作系统的不同,可能无法在分叉进程中运行Tk,而这正是多处理所做的。@AKX操作系统是Win7。Win7是否可能?您应该将startProcess移到createClientsWin外部,删除createClientsWin内部的检查。最后,在创建startingWin之前,添加检查@CommonSense的可能重复项而不是重复项。请检查上面的编辑。你的最终目标是什么?根据操作系统的不同,可能无法在分叉进程中运行Tk,而这正是多处理所做的。@AKX操作系统是Win7。Win7是否可能?您应该将startProcess移到createClientsWin外部,删除createClientsWin内部的检查。最后,在创建startingWin之前,添加检查是否为。