多处理 - 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。
我有一个关于多处理和 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。