python使⽤PySimpleGUI设置进度条
PySimpleGUI 使⽤起来感觉⽐tkinter要⽅便,当然我也没怎么⽤过这两者。只是学习模拟⼀下任务进度完成情况。
安装
pip install PySimpleGUI
⼀、简单进度条使⽤。
PySimpleGUI有⼀个⼀条命令即可展⽰进度条的控件。one_line_progress_meter
import time
import PySimpleGUI as sg
if __name__ == '__main__':
<_line_progress_meter('进度条标题',
10,
100,
'key1',
'内容')
# sg.one_line_progress_meter()
time.sleep(10)
基本参数
前⾯的参数分别代表
进度条标题,
进度条当前进度,
进度条最⼤进度,
进度条的 key, (key相同代表是同⼀个进度条)
进度条传⼊参数(可以是多个⾮关键字参数)。
<_line_progress_meter('进度条标题',
10,
100,
'key1',
'内容1')
其它常⽤参数orientation
由于参数*args 的存在,调⽤时如果希望传⼊⾃定义参数,那么前⾯的基本参数需要使⽤⾮关键字形式传⼊。当然也可以不传⼊⾃定义参数。
orientation 表⽰ 进度条是横向的或是纵向的。
h横向 v纵向(默认)
<_line_progress_meter(title='进度条标题2',
current_value=20,
max_value=100,
key='key2',
orientation='h')
模拟进度条⼀步步填满
import time
import PySimpleGUI as sg
if __name__ =='__main__':
for i in range(1000):
time.sleep(0.02)# 模拟0.02s 完成了千分之⼀的任务
<_line_progress_meter(
'进度条',
i+1,
1000,
'key',
'测试使⽤进度条',
orientation='h'
)
此处休眠时间可以当做完成任务的时间。没完成⼀点任务进度条就会增加。
但实际上真正运⾏时有很多耗时任务执⾏时会阻塞进度条。使进度条陷⼊未响应状态(如第⼀个图⽚)。所以⼀般会把耗时任务使⽤多线程执⾏,执⾏完成后想办法通知进度条更新状态。注(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 = ad(timeout=10)
if event =='Cancel'or event is None:
break
progress_bar.UpdateBar(i +1)
window.close()
此处依然是使⽤的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):
# 因为要⼤于ad设置超时时间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 = ad(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:# 没有读取到数据的话,继续ad
continue
else:# 读取到数据python怎么读取py文件
progress_bar.UpdateBar(progress_value)
if progress_value ==100:# 进度满跳出循环
break
window.close()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论