【发布时间】:2017-03-17 08:45:43
【问题描述】:
我有一个关于多处理和 tkinter 的问题。我在让我的进程与 tkinter GUI 并行运行时遇到了一些问题。我创建了一个简单的示例来练习,并且一直在阅读以了解多处理的基础知识。但是,当将它们应用于 tkinter 时,当时只运行一个进程。 (Using Multiprocessing module for updating Tkinter GUI) 另外,当我添加队列以在进程之间进行通信时,(How to use multiprocessing queue in Python?),进程甚至都不会启动。
目标: 我想要一个进程倒计时并将值放入队列中,一个在 1 秒后更新 tkinter 并向我显示值。
感谢所有建议
亲切的问候, S
编辑:我希望在调用 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()
【问题讨论】:
-
使用 after 不会让程序运行得更慢,它会让它运行得更快,因为你不会有处理队列的开销。由于您的
counting方法也使用after,所有多处理为您做的就是增加开销和复杂性。 -
但我希望在调用 after 方法时数据可用。所以问题不在于 after 函数,而在于 after 函数调用的方法。每次完成计算需要 1 秒。因此,GUI 每秒无响应半秒。
-
GUI 将显示由正在与 RS232 通信的函数收集的数据。这需要时间。所以除了之后的 1 秒之外,由于值收集,它会增加一些时间。它使我的 GUI “冻结”每个循环。
-
好的,如果您的实际问题是运行时间较长的代码,您需要在问题中提及。
-
我已经编辑了原始问题。
标签: python-3.x tkinter python-multiprocessing