函数在模块中传递给调用它的父模块

时间:2013-10-05 11:37:09

标签: python module tkinter

在具有两个模块的应用程序中: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)很难...我没有让它工作......

1 个答案:

答案 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()