python使用PySimpleGUI设置进度条及控件使用


Posted in Python onJune 10, 2021

PySimpleGUI 使用起来感觉比tkinter要方便,当然我也没怎么用过这两者。只是学习模拟一下任务进度完成情况。

安装

pip install PySimpleGUI

一、简单进度条使用

PySimpleGUI有一个一条命令即可展示进度条的控件。one_line_progress_meter

import time
import PySimpleGUI as sg


if __name__ == '__main__':
    sg.one_line_progress_meter('进度条标题',
                               10,
                               100,
                               'key1',
                               '内容')
    # sg.one_line_progress_meter()
    time.sleep(10)

python使用PySimpleGUI设置进度条及控件使用

基本参数
前面的参数分别代表
进度条标题,
进度条当前进度,
进度条最大进度,
进度条的 key, (key相同代表是同一个进度条)
进度条传入参数(可以是多个非关键字参数)。

sg.one_line_progress_meter('进度条标题',
                           10,
                           100,
                           'key1',
                           '内容1')

其它常用参数orientation
由于参数*args 的存在,调用时如果希望传入自定义参数,那么前面的基本参数需要使用非关键字形式传入。当然也可以不传入自定义参数。
orientation 表示 进度条是横向的或是纵向的。
h横向 v纵向(默认)

sg.one_line_progress_meter(title='进度条标题2',
                               current_value=20,
                               max_value=100,
                               key='key2',
                               orientation='h')

python使用PySimpleGUI设置进度条及控件使用

模拟进度条一步步填满

import time
import PySimpleGUI as sg


if __name__ == '__main__':
    for i in range(1000):
        time.sleep(0.02)    # 模拟0.02s 完成了千分之一的任务
        sg.one_line_progress_meter(
            '进度条',
            i+1,
            1000,
            'key',
            '测试使用进度条',
            orientation='h'
        )

python使用PySimpleGUI设置进度条及控件使用

此处休眠时间可以当做完成任务的时间。没完成一点任务进度条就会增加。

但实际上真正运行时有很多耗时任务执行时会阻塞进度条。使进度条陷入未响应状态(如第一个图片)。所以一般会把耗时任务使用多线程执行,执行完成后想办法通知进度条更新状态。注(PySimpleGUI组件需要运行在主线程,参见源文档说明)

one_line_progress_meter虽然方便,但样式无法控制,其上也有很多不关心的显示无法去除。。。

附。PySimpleGUI的弹窗使用。

sg.popup('注意!')
sg.popup_ok('默认弹窗')
sg.popup_yes_no('带Yes和No按钮的弹窗')
sg.popup_cancel('带cancel按钮的弹窗')
sg.popup_ok_cancel('带OK和cancel按钮的弹窗')
sg.popup_error('带红色error按钮的弹窗')
sg.popup_auto_close('几秒后自动关闭的弹窗')
sg.popup_auto_close('10秒后自动关闭的弹窗', auto_close_duration=10)

二、进度条控件使用

普通方法展示进度条控件。需要大概知晓布局和窗口的关系。

import PySimpleGUI as sg

# 布局,是一个用户定义的二维列表。
# 第一维德元素分居不同的行上,第二维度上的元素们居于同一行,不同列上
# 此处定义的列表  由三部分组成 Text文件 ProgressBar进度条 Cancel取消按钮构成
# Text Progress等有各自的参数设置,如size等。此处不再赘述
layout = [[sg.Text('任务完成进度')],
          [sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progressbar')],
          [sg.Cancel()]]

# window只需将自定义的布局加载出来即可 第一个参数是窗口标题。
window = sg.Window('机器人执行进度', layout)

# 根据key值获取到进度条
progress_bar = window['progressbar']

# window的read函数分为同步和异步,
# 不带timeout参数即为同步函数 一直等到手动点击按钮才会返回。
# 带timeout参数不为None的为异步函数,timeout时间内无时间或者点击了按钮都会产生结果。
# 异步方式不会阻塞后面的程序运行。
for i in range(1000):	# 循环
    event, values = window.read(timeout=10)
    if event == 'Cancel' or event is None:
        break
    progress_bar.UpdateBar(i + 1)

window.close()

python使用PySimpleGUI设置进度条及控件使用

此处依然是使用的for循环将进度条填满。下面使用线程模拟任务进度完成。

三、模拟任务完成度 进度条

使用线程模拟任务进度完成。当然,没有现实的任务,所以还是使用for循环加休眠组成。。。当然,与原来还是有区别的。因为任务在线程内完成,完成后需要通知主线程进度条更新。

import random
import time
from queue import Empty

import PySimpleGUI as sg
import threading
import queue

# 布局,是一个用户定义的二维列表。
# 第一维德元素分居不同的行上,第二维度上的元素们居于同一行,不同列上
# 此处定义的列表  由三部分组成 Text文件 ProgressBar进度条 Cancel取消按钮构成
layout = [[sg.Text('任务完成进度')],
          [sg.ProgressBar(100, orientation='h', size=(50, 20), key='progressbar')],
          [sg.Cancel()]]

# window只需将自定义的布局加载出来即可 第一个参数是窗口标题。
window = sg.Window('机器人执行进度', layout)

# 根据key值获取到进度条
progress_bar = window['progressbar']

# 队列 后进先出
q = queue.Queue()


def task_1():
    global q
    for i in range(100):
        # 因为要大于window.read设置超时时间100ms 保证读取时队列最多只有一个元素
        time.sleep(random.random() + 0.1)
        q.put(i+1)    # 向队列中放入当前任务完成度

# 创建多线程 设置以保护模式启动,即主线程运行结束,子线程也停止运行
worker_task = threading.Thread(target=task_1)
worker_task.setDaemon(True)
worker_task.start()

while True:     # 死循环不断读取队列中数据,直到读到100
    # event 就是返回的事件
    # 如点击Cancel后    event=Cancel
    event, values = window.read(timeout=100)
    if event == 'Cancel' or event is None:
        # 点击取消按钮或者返回事件为 None
        break

    # 10ms 无操作算超时event会等于 __TIMEOUT__
    # 其实不用判断
    try:
        # get是等待读取,直到读取到数据
        #  get_nowait 不等待,读取不到数据 就报异常
        progress_value = q.get_nowait()
    except Empty:   # 没有读取到数据的话,继续window.read
        continue
    else:   # 读取到数据
        progress_bar.UpdateBar(progress_value)
        if progress_value == 100:   # 进度满跳出循环
            break

window.close()

python使用PySimpleGUI设置进度条及控件使用

以上就是python使用PySimpleGUI设置进度条的详细内容,更多关于python PySimpleGUI进度条的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中使用中文的方法
Feb 19 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
详解Python中的分组函数groupby和itertools)
Jul 11 Python
python 字典修改键(key)的几种方法
Aug 10 Python
记一次python 内存泄漏问题及解决过程
Nov 29 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
Feb 26 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
python字符串反转的四种方法详解
Dec 02 Python
Python实现自动访问网页的例子
Feb 21 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
Mar 19 Python
Python自定义聚合函数merge与transform区别详解
May 26 Python
python3+PyQt5+Qt Designer实现界面可视化
Django使用echarts进行可视化展示的实践
教你如何使用Python Tkinter库制作记事本
Jun 10 #Python
Python中常见的反爬机制及其破解方法总结
Jun 10 #Python
Pytorch可视化的几种实现方法
OpenCV-Python实现怀旧滤镜与连环画滤镜
OpenCV-Python实现轮廓的特征值
Jun 09 #Python
You might like
PHP实现Socket服务器的代码
2008/04/03 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
php学习之变量的使用
2011/05/29 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
JS跨域代码片段
2012/08/30 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python实现扩展内置类型的方法分析
2017/10/16 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
python读取mysql数据绘制条形图
2020/03/25 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
会计专业应届生求职信
2013/11/24 职场文书
法学研究生自我鉴定范文
2013/12/04 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android