如何在tkinter上更新ttk进度栏

时间:2019-07-23 20:22:45

标签: python tkinter ttk

我有一个程序可以进行一些简单的网络抓取。我正在努力将其提供给我的同事使用,但是他们不熟悉代码,因此我想制作一个GUI。我已经开始使用tkinter,目前正在制作一个进度条,以显示该程序的位置(最多可能需要几个小时才能运行)。我的问题是我似乎无法更新进度条,并且所有在线资源都使用Tkinter,这是一个旧版本。这是我的代码:

我尝试将progressBar ['value']更新为我想要的任何数字,但这没有用。

from tkinter import *
from tkinter import ttk
import time


def clicked(progressBar): # runs a couple functions and updates the progress bar when the button is clicked
    num = 0
    for item in range(5):
        # functions go here
        num += 10
        progressBar['value'] = num
        time.sleep(2)

window = Tk()
window.title("Welcome to my app")
window.geometry('600x400')

progressBar = ttk.Progressbar(window, orient='horizontal', length=300, mode='determinate', maximum=100, value=0)
progressBar.grid(columnspan=3, row=2, sticky=(W, E))

btn = Button(window, text="Click me!", command=clicked(progressBar))
btn.grid(column=1, row=1)

window.mainloop()

tkinter窗口要等到我运行该程序10秒钟后才能打开,并且进度条已满50%。我希望在单击按钮后,栏缓慢增加。任何意见将是有益的!谢谢!

1 个答案:

答案 0 :(得分:0)

代码有两个问题:

  1. command=clicked(progressBar)实际上确实可以立即调用该函数。因此,只需使用command=clicked。由于该函数从全局范围获取它,因此不需要将progressBar作为argument传递。
  2. 函数clicked()运行时,GUI冻结。 5 * 2秒后,progressBar突然更新为5 * 10。要循环更新小部件,请使用update_idletastk方法:
import tkinter as tk
from tkinter import ttk
import time


def clicked():
    num = 0
    for item in range(5):
        num += 10
        progressBar['value'] = num
        window.update_idletasks()
        time.sleep(2)

window = tk.Tk()

progressBar = ttk.Progressbar(window, orient='horizontal', length=300, mode='determinate', maximum=100, value=0)
progressBar.grid(columnspan=3, row=2, sticky=(tk.W, tk.E))

btn = tk.Button(window, text="Click me!", command=clicked)
btn.grid(column=1, row=1)

window.mainloop()