Python多处理-TypeError:无法腌制'_tkinter.tkapp'对象
Posted
技术标签:
【中文标题】Python多处理-TypeError:无法腌制\'_tkinter.tkapp\'对象【英文标题】:Python multiprocessing - TypeError: cannot pickle '_tkinter.tkapp' objectPython多处理-TypeError:无法腌制'_tkinter.tkapp'对象 【发布时间】:2021-06-17 15:39:34 【问题描述】:我正在尝试使用 python 和 Tkinter 进行简单的多处理。但我收到错误消息。
Exception in Tkinter callback
...
...
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle '_tkinter.tkapp' object
程序很简单。运行后,它会打开窗口(起始页),我单击按钮将我重定向到实验页面,我单击按钮并开始一切
class experimentPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
# start experiment on click
self.button2 = tk.Button(self, text="Ready",
command=self.logic)
self.button2.pack()
def proc1(self):
while True:
print("LOL1")
def proc2(self):
while True:
print("LOL2")
def proc3(self):
while True:
print("LOL3")
def logic(self):
t1 = multiprocessing.Process(target=self.proc1)
t2 = multiprocessing.Process(target=self.proc2)
t3 = multiprocessing.Process(target=self.proc3)
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
这是我的主要内容
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
self.attributes('-fullscreen', True)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames =
for F in (startPage.startPage, experimentPage.experimentPage):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(startPage.startPage)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
app = Main()
app.mainloop()
我就是不能让它工作。感谢您的帮助。
【问题讨论】:
【参考方案1】:多处理使用multiprocessing.Queue
在进程之间交换信息。此队列实现使用pickle
对信息进行序列化和反序列化。
一些对象,包括 tkinter 的应用程序是不可提取的。
请参阅this SO 问题以供参考。
【讨论】:
这似乎更像是一个评论而不是对我的回答。 感谢它只是我的学士论文,所以它不是世界末日:D 但即使在一个核心上我也可以获得足够的数据,所以我知道我会保持原样。并感谢您的回答。以上是关于Python多处理-TypeError:无法腌制'_tkinter.tkapp'对象的主要内容,如果未能解决你的问题,请参考以下文章
Python 多处理 PicklingError:无法腌制 <type 'function'>
Python多处理:AttributeError:无法腌制本地对象