在具有两个模块的应用程序中:GUI.py和calcs.py,其中GUI导入并使用calcs中的函数,calcs函数更新GUI中的进度条有什么好方法?
当我将所有代码放在一个模块中时,它过去很简单。我将它重构为两个(仍在学习......),这是我现在唯一无法解决的问题。
e.g。作为一个非常简单的例子,GUI.py模块具有:
import tkinter as tk
import tkinter.ttk as ttk
import calc as c
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.prog = tk.DoubleVar()
self.result = tk.StringVar()
self.label = ttk.Label(textvariable = self.result)
self.progbar = ttk.Progressbar(self, maximum = 10, variable = self.prog)
self.button= ttk.Button(self, text = 'Go', command = lambda: self.result.set(c.stuff()))
self.label.pack()
self.progbar.pack()
self.button.pack()
a = GUI()
a.mainloop()
和calc.py:
def stuff():
counter = 0
for i in range(1, 11, 1):
counter += 1
# find a way to pass the value of counter to the GUI progress bar
# do lots of stuff that takes quite some time
return 'hey, a result!'
将calc函数中的进度计数器与GUI中的进度条变量链接起来有什么好方法?
当他们在一个模块中时,它当然很简单 - 只需要调用
prog.set(counter)
a.update_idletasks()
但不再。谷歌搜索和阅读这个我尝试使其线程和使用队列链接他们但这a)似乎矫枉过正b)很难...我没有让它工作......
答案 0 :(得分:1)
在GUI模块中创建一个更新进度条的函数,并将该函数的引用作为calc函数的参数:
# GUI.py
class GUI(...):
def __init__(...):
...
self.button= ttk.Button(..., command = lambda: c.stuff(self))
...
def update_progress(self):
...
# calc.py
def stuff(gui):
for i in range(...):
...
gui.update_progress()