如何使用多处理启动一个单独的新Tk()窗口?

2024-10-03 17:17:19 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码是可运行的,您只需复制/粘贴即可:

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()窗口。当我单击create按钮时,我只得到原始窗口(不是预期的窗口),它给了我以下错误:

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()

Tags: 代码textimportdefcreatebuttonmultiprocessinglabel
2条回答

在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()应该移到全局作用域中。你知道吗

此外,检查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()

相关问题 更多 >