多处理 - tkinter管道通信

时间:2017-03-17 08:45:44

标签: python-3.x tkinter python-multiprocessing

我对多处理和tkinter有疑问。我有一些问题让我的进程与tkinter GUI并行运行。我已经创建了一个简单的练习示例,并且已经阅读以了解多处理的基础知识。但是,当将它们应用于tkinter时,当时只运行一个进程。 (Using Multiprocessing module for updating Tkinter GUI)此外,当我添加队列以在进程之间进行通信时,(How to use multiprocessing queue in Python?),该进程甚至不会启动。

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

非常感谢所有建议

亲切的问候, 小号

编辑:我希望在调用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()

3 个答案:

答案 0 :(得分:3)

在窗口被销毁之前调用mainloop后,不会运行任何代码。在致电mainloop之前,您需要开始其他流程。

答案 1 :(得分:2)

你错误地称之后功能。第二个参数必须是要调用的函数的名称,而不是对函数的调用。

如果你称之为

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

它将调用counting(q)并等待返回值以指定为函数进行调用。

要分配带参数的函数,语法为

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

此外,在创建窗口之前启动第二个过程并调用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函数

答案 2 :(得分:2)

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