Python进度条GUI

时间:2016-08-10 20:32:37

标签: python tkinter progress-bar

我想知道你是否可以帮助我。我已经看到了用于创建进度条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更新。提前感谢您提供的任何帮助。

1 个答案:

答案 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