我想知道你是否可以帮助我。我已经看到了用于创建进度条GUI的代码,并且我尝试稍微修改它,以便我可以向进度条发送我想要的值。以下是我的代码
import tkinter as tk
from tkinter import ttk
import time
class progress_bar(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.progress = ttk.Progressbar(self, orient="horizontal", length=200, mode="determinate")
self.progress.pack()
self.val = 0
self.maxval = 1
self.progress["maximum"] = 1
def updating(self, val):
self.val = val
self.progress["value"] = self.val
print(self.val)
if self.val == self.maxval:
self.destroy()
def test():
for i in range(0, 101):
time.sleep(0.1)
app.updating(i/100)
app = progress_bar()
app.after(1, test)
app.mainloop()
当我运行代码时,打印消息会按预期逐渐增加,但是在创建GUI时,它会保持为空,直到程序完成并按需要关闭。你能告诉我我需要修改什么,以便GUI更新。提前感谢您提供的任何帮助。
答案 0 :(得分:2)
您遇到的问题是您的test
功能会阻止tkinter
事件循环。这意味着即使进度条value
得到更新,进度也不会出现在屏幕上(因为在test
结束之前不会重新绘制任何内容)。
要解决此问题,您需要摆脱test
中的循环,而是使用tkinter
代码进行重复更新。
以下是test
的修改版本,应该有效:
def test(i=0):
app.updating(i/100)
if i < 100:
app.after(100, test, i+1)
它不是显式循环,而是每100毫秒重新安排一次。它不是i
是一个循环变量,而是一个参数,每个预定调用的值都比之前的值大i
。