Tkinter库的学习记录15-进度条Progressbar 15、进度条Progressbar15-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, orientHORIZONTAL, length200, modedeterminate) pb2.pack(pady20) 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, orientHORIZONTAL, length200, modedeterminate) pb.pack(padx10, pady10) pb[maximum] 100 pb[value] 0 btn Button(root, textRunning, commandrunning) btn.pack(pady10) 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, orientHORIZONTAL, length200, modedeterminate) pb.pack(padx10, pady10) pb[value] 0 btn Button(root, textLoad, commandload) btn.pack(pady10) 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, orientHORIZONTAL, length200, modedeterminate) pb.pack(padx10, pady10) pb[maximum] 100 pb[value] 0 btn Button(root, textRunning, commandrunning) btn.pack(pady10) 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, orientHORIZONTAL, length200, modedeterminate) pb.pack(padx10, pady10) pb[maximum] 100 pb[value] 0 btnRun Button(root, textRun, commandrun) btnRun.pack(sideLEFT, padx5, pady10) btnStop Button(root, textStop, commandstop) btnStop.pack(sideLEFT, padx5, pady10) root.mainloop()执行结果15-4 indeterminate模式在这个模式下指针将左右移动主要目的是让用户知道程序仍在继续工作。下面程序实例ch15_6将Progressbar的模式设为indeterminate重新设计ch15_5这个程序在执行时可以看到指针左右移动若是单击Stop按钮可以可以中止指针移动。pb Progressbar(root, length200, modeindeterminate, orientHORIZONTAL)执行结果