用python中的tkinter包实现进度条

python中的tkinter包是一种常见的设计程序的GUI界面用的包。本文主要介绍这里面的一个组件:进度条(Progressbar)。Tkinter Progressbar里面对进度条组件已经做了一定的介绍,但比较抽象。本文以另一种方式介绍这个组件及其常用用法。

一、进度条的基本概念

进度条组件涉及多个基本概念,但本文主要介绍几个最重要的概念。而至于其它概念,多半只是涉及一些细节优化。

(一)进度条模式

tkinter支持两种模式的进度条:

1. determinate模式

这种模式的进度条通常是这样的:

也就是说,这样的进度条适用于任务的完成进度明确,且可以量化的情况。

2. indeterminate模式

这种模式的进度条通常是这样的:

也就是说,这样的进度条适用于任务的完成进度不明确或无法量化的情况。进度条的滚动只能表示任务正在运行中,无法表示任务完成了多少。

(二)进度条绑定的变量

进度条组件通常要绑定一个数值型变量,如Int或Double,这个变量存放进度条的进度数值。

对于determinate模式下的进度条,数值通常从0开始,随着进度的发展不断升高(如何升高将在下一节进行说明),但到达99后,继续升高将清零,重新从0开始。也就是说,如果进度量是x,那么该数值变量的值是x\%100。(\%表示取余)但数值可以手动调为100,此时进度条满格。

对于indeterminate模式下的进度条,数值通常从0开始,随着进度的发展不断升高,没有止境。

以上是对基本概念的介绍。下面贴上进度条组件相关的代码进行进一步说明。

prgVar = DoubleVar(value=0)
prgb = ttk.Progressbar(root, orient='horizontal', length=200, mode='determinate', variable=prgVar)
prgb.grid(row=0, columnspan=4)

在对象prgb里,variable参数对应的变量是prgVar,所以prgVar是进度条组件prgb绑定的变量。这个组件的模式是determinate。

用一个标签组件(Label)显示该变量的数值。

labl = Label(root, textvariable=prgVar)
labl.grid(row=2, columnspan=4)

效果如下:

如动画中所示,变量值到达99后退回了0,重新开始。

但如果是indeterminate模式,则是另一种情况。

prgbInfVar = IntVar(value=0)
prgbInf = ttk.Progressbar(root, orient="horizontal", length=200, mode='indeterminate', variable=prgbInfVar)
prgbInf.grid(row=3, columnspan=4)
lablInf = Label(root, textvariable=prgbInfVar)
lablInf.grid(row=5, columnspan=4)

效果如下:

如动画中所示,变量值一直在不断增加。

(三)进度条的动作

前面所示的那些动画中,进度条都是以一个速度在递进,数值也在增加。当然,进度条的数值可以通过人工调整其对应变量的值来设置,进度条的显示也会随数值而变化。

例如,要把determinate的进度条清空,只需将进度条绑定的变量值设为0即可。

prgVar.set(0)

此时进度条变空。

于此同时,进度条有start,step,以及stop三个常用动作。

prgb.start(p)
prgb.step(x)
prgb.stop()

以上三行代码,分别表示:

1. 进度条prgb开始自动递增,每隔p毫秒递增1。

2. 进度条prgb一次性递增x。该动作和进度条当前是否在自动递增无关,执行后也不会影响进度条是否继续自动递增。

3. 进度条prgb停止自动递增。注意该动作并不自动将进度条清零。

注意:若进度条的模式是determinate,以上动作执行时仍然遵守进度条变量超过99清零的规则。

二、程序示例

现在用一个例子来帮助读者复习进度条的相关知识。

有很多人在设计程序时,希望实现这样的显示:

当任务尚未开始时,进度条应为空

当任务正在进行时,由于任务的进度无法确认或量化,只能用indeterminate模式的进度条表示

当任务失败时,进度条回到空的状态。但当任务完成时,进度条应为满

这样的逻辑如何实现呢?对于indeterminate模式下的进度条,无论绑定的变量值为多少,都不可能实现进度条为空或满的显示。

此时,就需要将进度条的模式转变为determinate

prgbInf['mode'] = 'determinate'

在这里设计一个程序,实现这样的逻辑:

完整的代码:

from tkinter import *
from tkinter import ttkroot = Tk()
root.geometry('250x250')
root.title('Progress bar')def startProgress():prgb.start(100) #increment 1 per 100ms#labl['text'] = prgb['value']
def stepProgress():prgb.step(20) #increment 20#labl['text'] = prgb['value']
def stopProgress():prgb.stop()#labl['text'] = prgb['value']
def clearProgress():prgVar.set(0)def startProgressInf():prgbInf['mode'] = 'indeterminate'prgbInf.start(30) #increment 1 per 100ms#labl['text'] = prgb['value']
def finishProgressInf():prgbInfVar.set(100)prgbInf.stop()prgbInf['mode'] = 'determinate'#labl['text'] = prgb['value']
def stopProgressInf():prgbInf['mode'] = 'indeterminate'prgbInf.stop()#labl['text'] = prgb['value']
def clearProgressInf():prgbInfVar.set(0)prgbInf.stop()prgbInf['mode'] = 'determinate'prgVar = DoubleVar(value=0)
prgb = ttk.Progressbar(root, orient='horizontal', length=200, mode='determinate', variable=prgVar) #If progress bar has determined progress value, then use this
prgb.grid(row=0, columnspan=4)btStart = Button(root, text="Start", command=startProgress)
btStart.grid(row=1, column=0)
btStep = Button(root, text="Step", command=stepProgress)
btStep.grid(row=1, column=1)
btStop = Button(root, text="Stop", command=stopProgress)
btStop.grid(row=1, column=2)
btClear = Button(root, text="Clear", command=clearProgress)
btClear.grid(row=1, column=3)labl = Label(root, textvariable=prgVar)
labl.grid(row=2, columnspan=4)prgbInfVar = IntVar(value=0)
prgbInf = ttk.Progressbar(root, orient="horizontal", length=200, mode='indeterminate', variable=prgbInfVar)
prgbInf.grid(row=3, columnspan=4)btStartInf = Button(root, text="Start", command=startProgressInf)
btStartInf.grid(row=4, column=0)
btFinishInf = Button(root, text="Finish", command=finishProgressInf)
btFinishInf.grid(row=4, column=1)
btStopInf = Button(root, text="Stop", command=stopProgressInf)
btStopInf.grid(row=4, column=2)
btClearInf = Button(root, text="Clear", command=clearProgressInf)
btClearInf.grid(row=4, column=3)lablInf = Label(root, textvariable=prgbInfVar)
lablInf.grid(row=5, columnspan=4)#So, firstly, start, stop, step works for both determinate progress bar and indeterminate progress bar
#secondly, for determinate progress bar the value loops from 0 to 100, reset when full
#but for indeterminate progress bar, the value keeps increasing.root.mainloop()

在这个程序里,btStartInf按钮实现了任务正在进行时的进度条,btClearInf按钮实现了任务失败的进度条,btFinishInf按钮实现了任务完成的进度条。具体实现方式,见按钮对应的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/17853.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

20.使用标准差剔除异常值

标准差剔除异常值 1. 方法2. 示例代码2.1 数据读取与清洗2.2 分段读取数据并绘图2.3 解释2.4 outliers2.5 结果展示 我有个记录数据采集后格式是step_rewards.txt 的文档,里面只有一列数据,10*10000行数据,没有表头,分别代表奖励数…

中科蓝讯修改蓝牙名字:【图文讲解】

本文以市面上一款公板公模的畅销产品为例。K12蓝牙音响。 音响用的芯片是:AB5768E MIC用的芯片是:AB5769A 硬件框架图如下: 芯片修改名字,通过下载工具中的配置进行修改。选择蓝牙配置,然后会出现蓝牙名字&#xff…

旅行包发霉怎么处理 除霉及防霉解决方法

近些年听到很多箱包工厂的心声,为什么箱包旅行包每年都会出现长霉请况呢?长霉了,也就是长毛了,长出那些病菌、真菌、细菌等微生物。经ihaoer防霉人士介绍旅行包长霉处理方法如下: 旅行包长霉的因素 一、旅行包储存在阴…

14、交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等 获得元素距离带有定位祖先元素的位置获得元素自身的大小(宽度高度)注意:返回的数值都不…

【IEEE出版、八大高校联合举办、稳定EI检索】第四届人工智能与智能制造国际研讨会(AIIM 2024,12月20-22日)

第四届人工智能与智能制造国际研讨会(AIIM 2024) The 4th International Symposium on Artificial Intelligence and Intelligent Manufacturing 2024年12月20-22日 中国成都 重要信息 大会官网:www.isaiim.com 大会时间:202…

朴素贝叶斯算法探讨与实践

引言 和撰写博文[1]的缘由一样,本文是想要在所创设的专栏[2]里把所谓的十大机器学习算法[3]全部过一遍。 朴素贝叶斯算法是传统机器学习里的一种可以被用来进行分类的算法,本文将对其原理进行说明,并基于原理给出一个基于该算法的分类实践。…

《数据在内存中的存储》

内存函数 1. 整数在内存中的存储 (1)旧识回顾: 之前在学到操作符的时候,我们就学过了下面的内容: 整数的二进制的表示方式有三种,原码、反码、补码 有符号的整数,三种表示方式均有符号位和数…

【路径规划】粒子群算法、遗传算法、差分进化算法、灰狼优化算法、麻雀优化算法(PSO、GA、DE、GWO、SSA)路径规划

摘要 本文探讨了多种智能优化算法在路径规划中的应用,包括粒子群算法(PSO)、遗传算法(GA)、差分进化算法(DE)、灰狼优化算法(GWO)和麻雀优化算法(SSA&#x…

CSS基础知识05(弹性盒子、布局详解,动画,3D转换,calc)

目录 0、弹性盒子、布局 0.1.弹性盒子的基本概念 0.2.弹性盒子的主轴和交叉轴 0.3.弹性盒子的属性 flex-direction row row-reverse column column-reverse flex-wrap nowrap wrap wrap-reverse flex-dirction和flex-wrap的组合简写模式 justify-content flex-s…

如何搭建一台邮箱服务器,配置满分邮箱

如何搭建一台邮箱服务器,配置满分邮箱 搭建一台个人邮箱服务器听上去非常有技术含量,但只要准备工作充分,并且选择合适的软件,配置满分的邮箱,其实并没有想象中那么困难。在这篇文章中,我们将介绍搭建邮箱服务器的 必备…

DevOps工程技术价值流:打造卓越项目协作的优化宝典

一、引言 解锁项目协作的无限潜力,覆盖全链路实现流畅高效。 在当今瞬息万变的商业环境中,项目协作的效率和效果直接关系到企业的竞争力和市场响应速度。DevOps工程技术价值流中的项目协作优化,不仅是技术层面的革新,更是团队协…

【JAVA毕业设计】基于Vue和SpringBoot的冬奥会科普平台

本文项目编号 T 610 ,文末自助获取源码 \color{red}{T610,文末自助获取源码} T610,文末自助获取源码 目录 一、系统介绍二、数据库设计三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、核心代码6.1 查询项目类型6.…

基于的图的异常检测算法OddBall

OddBall异常检测算法出自2010年的论文《OddBall: Spotting Anomalies in Weighted Graphs》,它是一个在加权图(weighted graph)上检测异常点的算法,基本思路为计算每一个点的一度邻域特征,然后在整个图上用这些特征拟合出一个函数&#xff0c…

网络工程师教程第6版(2024年最新版)

网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。 相关信息: 出版社: 清华大学出版社 ISBN:9787302669197 内容简介: 本书是工业和信息化部教育与考试中心组织编写的考试用书。本书 根据…

算法复杂度——大O表示法

参考视频:常见的大O表示法有哪些?时间复杂度是什么?_哔哩哔哩_bilibili

Maven maven项目构建的生命周期 Maven安装配置 IDEA 配置 Maven

一,Maven的概述 Maven的作用:专门用于管理和构建Java项目的工具,它的主要功能有: 提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包,发布……)提…

排序算法(基础)大全

一、排序算法的作用: 排序算法的主要作用是将一组数据按照特定的顺序进行排列,使得数据更加有序和有组织。 1. 查找效率:通过将数据进行排序,可以提高查找算法的效率。在有序的数据中,可以使用更加高效的查找算法&…

GraphLLM:基于图的框架,通过大型语言模型处理数据

GraphLLM是一个创新的框架,它允许用户通过一个或多个大型语言模型(LLM)来处理数据。这个框架不仅提供了一个强大的代理,能够执行网络搜索和运行Python代码,还提供了一套工具来抓取网页数据,并将其重新格式化…

TransFormer--解码器:概括

TransFormer--解码器:概括 假设我们想把英语句子I am good(原句)翻译成法语句子Je vais bien(目标句)。首先,将原句I am good送入编码器,使编码器 学习原句,并计算特征值。在前文中&…

3D Gaussian Splatting 代码层理解之Part1

2023 年初,来自法国蔚蓝海岸大学和 德国马克斯普朗克学会的作者发表了一篇题为“用于实时现场渲染的 3D 高斯泼溅”的论文。该论文提出了实时神经渲染的重大进步,超越了NeRF等以往方法的实用性。高斯泼溅不仅减少了延迟,而且达到或超过了 NeRF 的渲染质量,在神经渲染领域掀…