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'对象的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法腌制 CompiledFFI 对象

TypeError:无法腌制 dict_items 对象

Python 多处理 PicklingError:无法腌制 <type 'function'>

Python多处理:AttributeError:无法腌制本地对象

Python多处理PicklingError:无法腌制<type'function'>

python 属性错误:无法腌制本地对象。使用多处理