多处理 - tkinter 管道通信

Multiprocessing - tkinter pipeline communication

我有一个关于多处理和 tkinter 的问题。我在让我的进程与 tkinter GUI 并行运行时遇到了一些问题。我创建了一个简单的示例来练习,并且一直在阅读以了解多处理的基础知识。但是,当将它们应用于 tkinter 时,一次只有一个进程运行。 (Using Multiprocessing module for updating Tkinter GUI) Additionally, when I added the queue to communicate between processes, (How to use multiprocessing queue in Python?),进程甚至不会启动。

目标: 我想要一个倒计时并将值放入队列的进程,一个在 1 秒后更新 tkinter 并显示值的进程。

感谢所有建议

亲切的问候, S

EDIT:我希望在调用 after 方法时数据可用。所以问题不在于 after 函数,而在于 after 函数调用的方法。每次计算完成需要0.5秒。因此,GUI 每秒有半秒没有响应。

EDIT2:已根据反馈对代码进行了更正,但此代码尚未 运行。

class Countdown(): 
    """Countdown prior to changing the settings of the flows"""

    def __init__(self,q):

        self.master = Tk()
        self.label = Label(self.master, text="", width=10)
        self.label.pack()
        self.counting(q)

    # Countdown()
    def counting(self, q):
        try:
            self.i = q.get()
        except:
            self.label.after(1000, self.counting, q)

        if int(self.i) <= 0:
            print("Go")
            self.master.destroy()

        else:
            self.label.configure(text="%d" % self.i)
            print(i)
            self.label.after(1000, self.counting, q)

def printX(q):
    for i in range(10):
        print("test")
        q.put(9-i)
        time.sleep(1)
    return


if __name__ == '__main__':
    q = multiprocessing.Queue()

    n = multiprocessing.Process(name='Process2', target=printX, args = (q,)) 
    n.start() 

    GUI = Countdown(q)
    GUI.master.mainloop()

在您调用 mainloop 直到 window 被销毁之前,没有代码会 运行。在调用 mainloop.

之前,您需要启动其他进程

你调用错了after函数。第二个参数必须是要调用的函数的名称,而不是对函数的调用。

如果你这样称呼它

self.label.after(1000, self.counting(q))

它将调用 counting(q) 并等待 return 值分配为要调用的函数。

给函数赋值的语法是

self.label.after(1000, self.counting, q)

此外,在创建 window 并调用 counting 之前启动第二个进程。

n = multiprocessing.Process(name='Process2', target=printX, args = (q,)) 
n.start() 

GUI = Countdown(q)
GUI.master.mainloop()

此外,您只需调用 mainloop 一次。你有任何一个职位都可以,但你只需要一个


编辑:您还需要将 (9-i) 放入队列中以使其倒计时。

q.put(9-i)

printX 函数内部

多处理在交互式 Ipython 笔记本中不起作用。 Multiprocessing working in Python but not in iPython 作为替代方案,您可以使用 spyder。