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爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
Python中urllib2模块的8个使用细节分享
Jan 01 Python
python实现爬虫下载美女图片
Jul 14 Python
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
python3 判断列表是一个空列表的方法
May 04 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
python中的函数递归和迭代原理解析
Nov 14 Python
Python创建临时文件和文件夹
Aug 05 Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 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
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
php动态绑定变量的用法
2015/06/16 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
显示、隐藏密码
2006/07/01 Javascript
新浪中用来显示flash的函数
2007/04/02 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
js代码实现随机颜色的小方块
2015/07/30 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Python实现包含min函数的栈
2016/04/29 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
Python使用folium excel绘制point
2019/01/03 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
Python换行与不换行的输出实例
2020/02/19 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
专升本个人自我评价
2013/12/22 职场文书
2014年消防工作实施方案
2014/02/20 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书