Как запустить отдельное новое окно Tk (), используя многопроцессорность? - PullRequest
0 голосов
/ 15 марта 2019

Следующий код работает, вы можете просто скопировать / вставить:

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

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Функция в глобальной области видимости должна использоваться для многопроцессорной целевой функции, поэтому 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 голос
/ 15 марта 2019

При использовании многопроцессорности с 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...