我对多处理和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()
答案 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。