当前位置:   article > 正文

27-Tkinter 组件-Progressbar进度条控件_tkinter加入进度条

tkinter加入进度条

Progressbar进度条控件

进度条的作用就是提示用户进度信息。可以有两种方式:

  • 提示完成度
    比如,正在安装程序的进度,一般是从0%到100%。
  • 提示正在进行处理
    比如正在处理数据内容,并不知道何时能够处理完毕。这个时候的进度是提示用户有任务正在进行。此类的提示没有完成度提示,只是进度条来回往复的移动,表示任务正在进行中

进度条对象是定义在ttk中的,使用的时候需要引入from tkinter.ttk import Progressbar

参数

属性描述
cursor鼠标位于进度条内时的形状
length进度条长度
maximum进度条最大刻度值
mode进度条的模式。有两种:‘determinate’和’indeterminate
1.determinate:对于’determinate’的模式,在程序的控制下,进度条的指示会从0开始,移动到最大刻度,然后停止。这种情况用于知道确切的进度数据。比如读取文件,是知道文件的大小的,可以用百分比来显示完成程度。
2.indeterminate:对于’indeterminate’,进度条的刻度是往复运动,表示某个处理过程正在进行中。这种情况用于不知道确切的进度数据,也就是说,不知道完成的状况。比如查询数据库返回大量的结果,程序事先无法确认会返回多少的结果。
orient进度条的方向,有HORIZONTAL VERTICAL两种
style定义进度条的外观
takefocus是否可以通过Tab获得输入焦点
variable与进度条关联的变量。可以设置或获得进度条的当前值
value设置或者获取进度条的当前值
  • cursor 设置鼠标位于进度条内时的形状。
# 说明:长度是'2i',表示是2英寸长。
import tkinter as tk
from tkinter import ttk
import time 
def increment(*args):
    for i in range(100):
        p1["value"] = i+1
        root.update()
        time.sleep(0.1)
root = tk.Tk()
root.geometry('320x240')
p1 = ttk.Progressbar(root, length=200,cursor='spider',
                     mode="determinate",
                     orient=tk.HORIZONTAL)
p1.grid(row=1,column=1)
btn = ttk.Button(root,text="Start",command=increment)
btn.grid(row=1,column=0)
root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • length 设置进度条长度。默认单位是像素,也可以是其他的单位
import tkinter as tk
from tkinter import ttk
import time 
def increment(*args):
    for i in range(100):
        p1["value"] = i+1
        root.update()
        time.sleep(0.1)
root = tk.Tk()
root.geometry('360x240')
p1 = ttk.Progressbar(root, length='2i', mode="determinate",
                     orient=tk.HORIZONTAL)
p1.grid(row=1,column=1)
btn = ttk.Button(root,text="Start",command=increment)
btn.grid(row=1,column=0)
root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • maximum 定义进度条的最大刻度。默认值是100。

    说明:进度条的最大刻度设为200,而在increment()回调函数中,只更新进度条的数值到100。当循环完成之后,进度条只更新了50%的刻度。

import tkinter as tk
from tkinter import ttk
import time 
def increment(*args):
    for i in range(100):
        p1["value"] = i+1
        root.update()
        time.sleep(0.1)
root = tk.Tk()
root.geometry('320x240')
p1 = ttk.Progressbar(root, length=200, mode="determinate",
                     maximum=200,orient=tk.HORIZONTAL)
p1.grid(row=1,column=1)
btn = ttk.Button(root,text="Start",command=increment)
btn.grid(row=1,column=0)
root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • mode
# 说明:indeterminate的调用方式是使用进度条控件的start()方法。
import tkinter as tk
from tkinter import ttk
import time 
def increment(*args):
    p1.start()
root = tk.Tk()
root.geometry('320x240')
p1 = ttk.Progressbar(root, length=200, mode="indeterminate",
                     maximum=200,orient=tk.HORIZONTAL)
p1.grid(row=1,column=1)
btn = ttk.Button(root,text="Start",command=increment)
btn.grid(row=1,column=0)
root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • orient 设置进度条的方向,有两种格式:水平(HORIZONTAL)和垂直(VERTICAL)。
  • style 设置进度条的外观。
  • takefocus 设置进度条是否可以获得输入焦点。
  • able 和进度条有关的一个变量IntVar(),可以用来设置或者获取进度条当前的数值。
  • value 进度条当前的数值。

方法

函数描述
start(interval=None)自动调整进度条的位置。通过启动一个循环定时事件,按照定义的步长调整进度条位置。定时器的间隔由interval参数来设定。间隔单位是毫秒.默认间隔是50毫秒。
step(amount=None)每次增加一次amount,默认值是1.0,在determinate模式下,指针不会超过maximum参数。在indeterminate模式下,当指针达到maximum参数值的前一格时,指针会回到起点
stop()停止定时器,停止进度条的自动调整

开始自动调整进度条,默认时间间隔是50毫秒。自动调整是依靠启动一个可循环的定时器实现的。每次的调整步长由step()函数实现。

停止进度条的调整。

import tkinter as tk
from tkinter import ttk
import time

def start(*args):
    p1.start(30)

def stop(*args):
    value=p1['value']
    p1.stop()
    p1['value']=value

root = tk.Tk()
root.geometry('320x240')

p1 = ttk.Progressbar(root, length=200, mode="indeterminate", orient=tk.HORIZONTAL)
p1.grid(row=1,column=0,columnspan=2)

btn_start = ttk.Button(root,text="开始", command=start,width=10)
btn_start.grid(row=0,column=0)

btn_stop = ttk.Button(root,text="停止", command=stop,width=10)
btn_stop.grid(row=0,column=1)

root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Progressbar 动画设计

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

import time
import tkinter
import tkinter.ttk

def show():
    for i in range(100):
        # 每次更新加1
        progressbarOne['value'] = i + 1
        # 更新画面
        root.update()
        time.sleep(0.05)

root = tkinter.Tk()
root.geometry('150x120')

progressbarOne = tkinter.ttk.Progressbar(root)
progressbarOne.pack(pady=20)
# 进度值最大值
progressbarOne['maximum'] = 100
# 进度值初始值
progressbarOne['value'] = 0

button = tkinter.Button(root, text='Running', command=show)
button.pack(pady=5)

root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

模拟真实下载,下载总量是10000B, 每次下载500B

def show():
    # 设置进度条的目前值
    progressbarOne['value'] = 0
    # 设置进度条的最大值
    progressbarOne['maximum'] = maxbyte
    # 调用loading方法
    loading()

def loading():
    # 改变变量属性
    global byte
    # 每次运行500B
    byte += 500
    # 设置指针
    progressbarOne['value'] = byte
    if byte < maxbyte:
        # 经过100ms后再次调用loading方法
        progressbarOne.after(100, loading)


root = tkinter.Tk()
root.geometry('150x120')

# 设置下载初值
byte = 0
# 设置下载最大值
maxbyte = 10000

progressbarOne = tkinter.ttk.Progressbar(root)
progressbarOne.pack(pady=20)

button = tkinter.Button(root, text='Running', command=show)
button.pack(pady=5)

root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

例子

import tkinter
import tkinter.ttk
root = tkinter.Tk()
root.geometry('150x120')

progressbarOne = tkinter.ttk.Progressbar(root)
progressbarOne.pack(pady=20)
# 进度值最大值
progressbarOne['maximum'] = 100
# 进度值初始值
progressbarOne['value'] = 20
# 横排 长度200 起点移至终点
progressbarTwo = tkinter.ttk.Progressbar(root, orient=tkinter.HORIZONTAL, length=200, mode='determinate')
progressbarTwo.pack(pady=20)
# 进度值最大值
progressbarTwo['maximum'] = 100
# 进度值初始值
progressbarTwo['value'] = 80

root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
import time
import tkinter
import tkinter.ttk

def show():
    while progressbarOne.cget('value') <= progressbarOne['maximum']:
        progressbarOne.step(2)
        root.update()
        print(progressbarOne.cget('value'))
        time.sleep(0.05)

root = tkinter.Tk()
root.geometry('150x120')

progressbarOne = tkinter.ttk.Progressbar(root, length=200, mode='determinate', orient=tkinter.HORIZONTAL)
progressbarOne.pack(pady=20)

progressbarOne['maximum'] = 100
progressbarOne['value'] = 0

button = tkinter.Button(root, text='Running', command=show)
button.pack(pady=5)

root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

使用start()方法启动动画,单击stop按钮停止

import tkinter
import tkinter.ttk

def run():
    progressbarOne.start()

def stop():
    progressbarOne.stop()


root = tkinter.Tk()
root.geometry('150x120')

progressbarOne = tkinter.ttk.Progressbar(root, length=200, mode='determinate', orient=tkinter.HORIZONTAL)
progressbarOne.pack(padx=5, pady=10)

progressbarOne['maximum'] = 100
progressbarOne['value'] = 0

buttonRun = tkinter.Button(root, text='Run', width=6, command=run)
buttonRun.pack(padx=10, pady=5, side=tkinter.LEFT)

buttonStop = tkinter.Button(root, text='Stop', width=6, command=stop)
buttonStop.pack(padx=10, pady=5, side=tkinter.RIGHT)

root.mainloop()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/761196
推荐阅读
相关标签
  

闽ICP备14008679号