【问题标题】:Update tkinter progressbar in a multipage GUI from function defined under the parent class从父类下定义的函数更新多页 GUI 中的 tkinter 进度条
【发布时间】:2021-05-01 13:21:38
【问题描述】:

我有一个包含多个页面的 GUI,我在父类 (APP) 下定义了所有功能。我正在使用threading.Timer 来更新当前函数的进度。这个函数也在父类下定义(我们称之为update_time())。

我想在每次线程Timer 更新时更新 GUI 的第三页上的进度条。如何从函数update_time() 访问 GUI 第 3 页上的进度条,以便在每次线程计时器更新时更新进度条?

def update_time(self):
    timer = threading.Timer(self.update_interval, self.update_time)
    timer.start()

    self.current_count += 1
    current_percentage = self.current_count / self.total_count
    current_percentage = current_percentage if current_percentage <= 1 else 1

    # This is the progress bar that would reside on PageThree
    PageThree.progress['value'] = round(current_percentage, 3) * 100
    PageThree.style.configure('text.Horizontal.TProgressbar', text='{:.1%}'.format(current_percentage))

PageThree.progress 显然不起作用,但我正在寻找类似的想法,即在 PageThree 类中调用进度条并将其更新为当前百分比。

【问题讨论】:

  • 每次调用时都需要将PageThree传入update_time(),或者将其传入这个类的__init__(),这样self.PageThree.progress...才会起作用。
  • 如果您想要一个连贯的答案,您将需要在您的问题中添加更多代码,以便我们对您的应用设计有一个整体的了解。
  • 请创建一个minimal reproducible example 来复制您遇到的问题,但代码行数尽可能少。

标签: python multithreading tkinter progress-bar


【解决方案1】:

我最终将 Progressbar 变量设置为全局 DoubleVar() 并在函数调用中更新了该变量。 (这不是函数式代码,只是给出大致思路的示例)

class MainPage(tk.Tk)

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
      
    def update_time(self, a_num):
        progress = a_num
        PageThree.update_progress(self, progress)


class PageThree(tk.Frame)

      def update_progress(self, val):
          treatment_progress_var.set(val)

      def __init__(self, parent, controller):
          tk.Frame.__init__(self, parent)

          global progress_var
          progress_var = DoubleVar()


           ttk.Progressbar(self, orient=HORIZONTAL, 
           textvariable=treatment_progress_txt, 
           mode='determinate', variable=treatment_progress_var)

这将允许每次调用 update_time() 时更新进度条

【讨论】:

  • 使用全局变量长期以来被认为是一种糟糕的编程习惯 _ 所以 IMO 这不是一个好的解决方案。为避免这样做,您似乎可以将DoubleVar 设为controller 属性,因为在创建实例时它会传递给每个Frame 子类(并为每个__init__() 添加self.controller = controller)。
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
相关资源
最近更新 更多