我有一个程序可以进行一些简单的网络抓取。我正在努力将其提供给我的同事使用,但是他们不熟悉代码,因此我想制作一个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%。我希望在单击按钮后,栏缓慢增加。任何意见将是有益的!谢谢!
答案 0 :(得分:0)
代码有两个问题:
command=clicked(progressBar)
实际上确实可以立即调用该函数。因此,只需使用command=clicked
。由于该函数从全局范围获取它,因此不需要将progressBar作为argument传递。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()