我希望我的Tkinter Progressbar以递增方式更新。我已尝试按照here提到的示例进行操作。
最初,我在不使用线程的情况下尝试了代码。这导致在"开始"之前出现延迟。按钮甚至出现了。一旦我添加了线程部分,初始UI和Progressbar小部件就会正确显示。
但是,我仍然坚持Progressbar不会增加的问题。也许我的Queue部分代码破坏了它?我做了一些实验,但以下是我最终的结果:
class MainUI:
def __init__(self, master, queue):
self.queue = queue
self.master = master
self.main_container = Frame(self.master)
self.main_container.pack()
self.counter = IntVar()
self.btn_start = Button(self.main_container, command=self.btn_start_click)
self.btn_start.configure(
text="Start", background="Grey",
padx=50
)
self.btn_start.pack(side=LEFT)
def progress_bar(self):
self.pbar_top = Toplevel(self.main_container)
self.download_label = Label(
self.pbar_top,
text="Download Bar"
)
self.download_label.pack(side=TOP)
self.download_bar = ttk.Progressbar(
self.pbar_top, orient="horizontal",
length=400, mode="determinate",
variable=self.counter, maximum=5
)
self.download_bar.pack(side=TOP)
def prog_bar_update(self, value):
self.counter = value
def btn_start_click(self):
self.progress_bar()
def process_queue(self):
while self.queue.qsize():
try:
value = self.queue.get(0)
self.prog_bar_update(value)
except Queue.Empty:
pass
class Logic:
def __init__(self, master):
self.master = master
self.queue = Queue.Queue()
self.gui = MainUI(master, self.queue)
t = threading.Thread(target=self.start_logic)
t.start()
self.periodic_call()
def periodic_call(self):
self.gui.process_queue()
self.master.after(100, self.periodic_call)
def start_logic(self):
for i in range(4):
time.sleep(2)
increment = i
self.queue.put(increment)
root = Tk()
root.title("Progress Bar Test")
main_ui = Logic(root)
root.mainloop()
上面的代码导致显示进度条,但增量永远不会发生。我想我在这里缺少一些非常基本和明显的东西。有人可以赐教我吗?
答案 0 :(得分:4)
看一下这行代码:
self.counter = value
在执行此代码行之前,self.counter
是IntVar
的实例。在此声明之后,self.counter
只是一个int。将行更改为:
self.counter.set(value)