Tkinter库的学习记录15-进度条Progressbar

📅 2026/7/11 20:30:45 👁️ 阅读次数 📝 编程学习
Tkinter库的学习记录15-进度条Progressbar

15、进度条Progressbar

15-1 Progressbar的基本使用

Progressbar可以解释为进度条,主要是当作一个工作进度指针,在这个控件中会有一个指针,由此指针可以了解工作进度,例如,档案下载、档案解压缩等。用户可以由这个工作进度指针确认系统仍在进行中,同时也可以了解目前进行到哪一个阶段。

它的构造方法语法如下。

Progressbar(父对象, options, ...)

参数一:同上。

options参数:

(1) length:进度条的长度,默认是100像素。

(2) mode:可以有下列两种模式。

①daterminate:一个指针会从起点移至终点,通常当我们知道所需工作时间时,可以使用此模式,这是默认模式。

②indeterminate:一个指针会在起点和重点间来回移动,通常当我们不知道工作所需时间时,可以使用此模式。

(3) maximum:进度条的最大值,默认是100。

(4) name:进度条的名称,供程序参考引用。

(5) orient:进度条的方向,可以是HORIZONTAL(默认)或VERTICAL。

(6) value:进度条的目前值。

(7) variable:记录进度条目前的进度值。

下面程序实例:进度条最大值是100,列出目前值是50的界面。其中一个进度条大部分参数使用默认值,另一个则是使用自定义方式。

from tkinter import * from tkinter.ttk import * root = Tk() root.title("ch15_1") root.geometry("300x140") # 使用默认创建进度条 pb1 = Progressbar(root) pb1.pack() pb1["maximum"] = 100 pb1["value"] = 50 # 使用各参数自定义方式创建进度条 pb2 = Progressbar(root, orient=HORIZONTAL, length=200, mode="determinate") pb2.pack(pady=20) pb2["maximum"] = 100 pb2["value"] = 50 root.mainloop()

执行结果

15-2 Progressbar动画设计

如果想要设计含动画效果的Progressbar,可以在每次更新Progressbar对象的value值时调用update()方法,这时窗口可以依据value值重绘,这样就可以达到动画效果。

下面程序实例ch15_2,设计带动画效果的Progressbar,最大值是100,从0开始,每隔0.05s可以移动一格。

from tkinter import * from tkinter.ttk import * import time def running(): for i in range(100): pb["value"] = i + 1 root.update() # 更新画面 time.sleep(0.05) root = Tk() root.title("ch15_2") root.geometry("300x140") pb = Progressbar(root, orient=HORIZONTAL, length=200, mode="determinate") pb.pack(padx=10, pady=10) pb["maximum"] = 100 pb["value"] = 0 btn = Button(root, text="Running", command=running) btn.pack(pady=10) root.mainloop()

执行结果

假设我们在设计下载资料的Progressbar,在真实的应用中,可以将所获得的档案大小当作Progressbar对象maximum参数的值,然后设置每次读取数据数量(下载量),只要总下载量小于maximum,则继续下载。

下面是模拟下载的Progressbar设计,假设下载总量是10000B,每次读取数据数量(下载量)是500B。

from tkinter import * from tkinter.ttk import * import time def load(): pb["value"] = 0 # 重置进度条 pb["maximum"] = maxbytes loading() def loading(): global bytes bytes += 500 pb["value"] = bytes if bytes < maxbytes: pb.after(50, loading) root = Tk() root.title("ch15_3") bytes = 0 # 设置初值 maxbytes = 10000 # 假设下载文件大小 pb = Progressbar(root, orient=HORIZONTAL, length=200, mode="determinate") pb.pack(padx=10, pady=10) pb["value"] = 0 btn = Button(root, text="Load", command=load) btn.pack(pady=10) root.mainloop()

执行结果

15-3 Progressbar的方法start()/step()/stop()

这几个方法的含义如下。

(1) start(interval):每隔interval时间移动一次指针。interval的默认值是50ms,每次指针移动调用一次step(delta)。在step()方法内的delta参数的意义是增值量。

(2) step(delta):每次增加一次delta,默认值是1.0,在determinate模式,指针不会超过maximum参数值。在indeterminate模式,当指针达到maximum参数值的前一格时,指针会回到起点。

(3) stop():停止start()的运行。

下面程序实例:验证使用step(2)方法,相当于每次增值2,当指针到达末端值100前一格时(相当于是98),指针会回到0,然后重新开始移动。这个程序执行时同时在Python Shell窗口会列出目前指针的值。

from tkinter import * from tkinter.ttk import * import time def running(): while pb.cget("value") <= pb["maximum"]: pb.step(2) root.update() # 更新画面 print(pb.cget("value")) # 打印指针值 time.sleep(0.05) root = Tk() root.title("ch15_4") pb = Progressbar(root, orient=HORIZONTAL, length=200, mode="determinate") pb.pack(padx=10, pady=10) pb["maximum"] = 100 pb["value"] = 0 btn = Button(root, text="Running", command=running) btn.pack(pady=10) root.mainloop()

执行结果

下面程序实例ch15_5:使用start()方法启动Progressbar的动画,当单击gressbar的动画,当单击Stop按钮后才可中止此动画。

from tkinter import * from tkinter.ttk import * import time def run(): pb.start() def stop(): pb.stop() root = Tk() root.title("ch15_4") pb = Progressbar(root, orient=HORIZONTAL, length=200, mode="determinate") pb.pack(padx=10, pady=10) pb["maximum"] = 100 pb["value"] = 0 btnRun = Button(root, text="Run", command=run) btnRun.pack(side=LEFT, padx=5, pady=10) btnStop = Button(root, text="Stop", command=stop) btnStop.pack(side=LEFT, padx=5, pady=10) root.mainloop()

执行结果

15-4 indeterminate模式

在这个模式下指针将左右移动,主要目的是让用户知道程序仍在继续工作。

下面程序实例ch15_6:将Progressbar的模式设为indeterminate,重新设计ch15_5,这个程序在执行时可以看到指针左右移动,若是单击Stop按钮可以可以中止指针移动。

pb = Progressbar(root, length=200, mode="indeterminate", orient=HORIZONTAL)

执行结果