【问题标题】:Tkinter: Update widget from different moduleTkinter:从不同模块更新小部件
【发布时间】:2015-06-04 18:11:16
【问题描述】:

我有一个用 Python 3 编写的 Tkinter 应用程序。 我有一个模块,其中包含一个类,我在其中创建所有小部件。我正在尝试从完成繁重工作的单独模块更新进度条。

#GUI.py
import tkinter as tk
from tkinter.filedialog import askopenfilename, askdirectory
import tkinter.ttk as ttk

import Work_Module

progress_bar = None

class Application(tk.Frame):
    def __init__(self, master=None):
        master.title('CCD Creator  Version 1.0')
        tk.Frame.__init__(self, master, width=500)
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        global progress_bar

        progress_bar = tk.ttk.Progressbar(orient=tk.HORIZONTAL, length=200, mode='determinate')
        progress_bar.pack(side="bottom")

        self.run = tk.Button(self, text="  Run  ", fg="green", command=self.do_work)
        self.run.pack(side="top")

        #Continue creating various widgets that don't need to be updated by other modules

    def do_work(self):
        Work_Module.main()

def main():
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()

if __name__ == '__main__':
     main()

这是一个模块,其中包含一个我想跟踪进度的“繁重工作”。

#Work_Module.py

class Work:
    def __init__(self):
    #Do some intensive work


main():
    for idx, job in enumerate(work_list):
        Work()
        import GUI
        percentage_done = idx / len(job_list) * 100
        GUI.progress_bar.step(percentage_done)

我遇到的问题是 Progress_bar 在 Work_Module 中的值为 None。它在 GUI 模块中分配了一个对象,但当尝试从 Work_Module 引用它时,该对象不会保留。我知道在 main 方法中导入 GUI 有点奇怪,我怀疑这是某种命名空间问题或循环导入问题,但我似乎想不出解决这个问题的方法。

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    一种方法是在调用mainloop() 之前将progress_bar 注入Work_Module

    def main():
        root = tk.Tk()
        app = Application(master=root)
        Work_Module.progress_bar = progress_bar
        app.mainloop()
    

    如果你愿意,也可以省去progress_barglobal 方面:

        def create_widgets(self):
            # global progress_bar (no longer needed)
            # add 'self'
            self.progress_bar = tk.ttk.Progressbar(orient=tk.HORIZONTAL, length=200, mode='determinate')
            self.progress_bar.pack(side="bottom")
            ...
    
    def main():
        root = tk.Tk()
        app = Application(master=root)
        Work_Module.progress_bar = self.progress_bar  # add 'self'
        app.mainloop()
    

    【讨论】:

    • 这解决了将 None 类型分配给 progress_bar 的问题,但现在我看到的问题是进度条没有增量更新。 work_module 完成所有工作后,进度条跳到最后。
    • @sager89:你可能不得不让/告诉tkinter更新屏幕。
    • 我不得不创建一个单独的线程来完成这项工作,因为 GUI 是一个阻塞调用。之后,它起作用了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多