Python 模块中的函数将值传递给调用它的父模块

Python 模块中的函数将值传递给调用它的父模块,python,module,tkinter,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): de

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

在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()

在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()

哦,我明白了。因此,我可以将对gui.py类的引用传递给calc.py函数。那会让事情变得容易!我没有意识到这一点(假设这意味着在calc.py中导入gui.py,并拥有一组循环的导入,其中每个模块都尝试导入另一个)。哦,我明白了。因此,我可以将对gui.py类的引用传递给calc.py函数。那会让事情变得容易!我没有意识到这一点(假设这意味着在calc.py中导入gui.py,并拥有一组循环的导入,其中每个模块尝试导入另一个)。