python使用PySimpleGUI設(shè)置進(jìn)度條及控件使用
PySimpleGUI 使用起來(lái)感覺(jué)比tkinter要方便,當(dāng)然我也沒(méi)怎么用過(guò)這兩者。只是學(xué)習(xí)模擬一下任務(wù)進(jìn)度完成情況。
安裝
pip install PySimpleGUI
一、簡(jiǎn)單進(jìn)度條使用
PySimpleGUI有一個(gè)一條命令即可展示進(jìn)度條的控件。one_line_progress_meter
import time
import PySimpleGUI as sg
if __name__ == '__main__':
sg.one_line_progress_meter('進(jìn)度條標(biāo)題',
10,
100,
'key1',
'內(nèi)容')
# sg.one_line_progress_meter()
time.sleep(10)

基本參數(shù)
前面的參數(shù)分別代表
進(jìn)度條標(biāo)題,
進(jìn)度條當(dāng)前進(jìn)度,
進(jìn)度條最大進(jìn)度,
進(jìn)度條的 key, (key相同代表是同一個(gè)進(jìn)度條)
進(jìn)度條傳入?yún)?shù)(可以是多個(gè)非關(guān)鍵字參數(shù))。
sg.one_line_progress_meter('進(jìn)度條標(biāo)題',10,100,'key1','內(nèi)容1')
其它常用參數(shù)orientation
由于參數(shù)*args 的存在,調(diào)用時(shí)如果希望傳入自定義參數(shù),那么前面的基本參數(shù)需要使用非關(guān)鍵字形式傳入。當(dāng)然也可以不傳入自定義參數(shù)。
orientation 表示 進(jìn)度條是橫向的或是縱向的。
h橫向 v縱向(默認(rèn))
sg.one_line_progress_meter(title='進(jìn)度條標(biāo)題2', current_value=20, max_value=100, key='key2', orientation='h')

模擬進(jìn)度條一步步填滿
import time import PySimpleGUI as sg if __name__ == '__main__': for i in range(1000): time.sleep(0.02) # 模擬0.02s 完成了千分之一的任務(wù) sg.one_line_progress_meter( '進(jìn)度條', i+1, 1000, 'key', '測(cè)試使用進(jìn)度條', orientation='h' )

此處休眠時(shí)間可以當(dāng)做完成任務(wù)的時(shí)間。沒(méi)完成一點(diǎn)任務(wù)進(jìn)度條就會(huì)增加。
但實(shí)際上真正運(yùn)行時(shí)有很多耗時(shí)任務(wù)執(zhí)行時(shí)會(huì)阻塞進(jìn)度條。使進(jìn)度條陷入未響應(yīng)狀態(tài)(如第一個(gè)圖片)。所以一般會(huì)把耗時(shí)任務(wù)使用多線程執(zhí)行,執(zhí)行完成后想辦法通知進(jìn)度條更新?tīng)顟B(tài)。注(PySimpleGUI組件需要運(yùn)行在主線程,參見(jiàn)源文檔說(shuō)明)
one_line_progress_meter雖然方便,但樣式無(wú)法控制,其上也有很多不關(guān)心的顯示無(wú)法去除。。。
附。PySimpleGUI的彈窗使用。
sg.popup('注意!')
sg.popup_ok('默認(rèn)彈窗')
sg.popup_yes_no('帶Yes和No按鈕的彈窗')
sg.popup_cancel('帶cancel按鈕的彈窗')
sg.popup_ok_cancel('帶OK和cancel按鈕的彈窗')
sg.popup_error('帶紅色error按鈕的彈窗')
sg.popup_auto_close('幾秒后自動(dòng)關(guān)閉的彈窗')
sg.popup_auto_close('10秒后自動(dòng)關(guān)閉的彈窗', auto_close_duration=10)
二、進(jìn)度條控件使用
普通方法展示進(jìn)度條控件。需要大概知曉布局和窗口的關(guān)系。
import PySimpleGUI as sg
# 布局,是一個(gè)用戶定義的二維列表。
# 第一維德元素分居不同的行上,第二維度上的元素們居于同一行,不同列上
# 此處定義的列表 由三部分組成 Text文件 ProgressBar進(jìn)度條 Cancel取消按鈕構(gòu)成
# Text Progress等有各自的參數(shù)設(shè)置,如size等。此處不再贅述
layout = [[sg.Text('任務(wù)完成進(jìn)度')],
[sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progressbar')],
[sg.Cancel()]]
# window只需將自定義的布局加載出來(lái)即可 第一個(gè)參數(shù)是窗口標(biāo)題。
window = sg.Window('機(jī)器人執(zhí)行進(jìn)度', layout)
# 根據(jù)key值獲取到進(jìn)度條
progress_bar = window['progressbar']
# window的read函數(shù)分為同步和異步,
# 不帶timeout參數(shù)即為同步函數(shù) 一直等到手動(dòng)點(diǎn)擊按鈕才會(huì)返回。
# 帶timeout參數(shù)不為None的為異步函數(shù),timeout時(shí)間內(nèi)無(wú)時(shí)間或者點(diǎn)擊了按鈕都會(huì)產(chǎn)生結(jié)果。
# 異步方式不會(huì)阻塞后面的程序運(yùn)行。
for i in range(1000): # 循環(huán)
event, values = window.read(timeout=10)
if event == 'Cancel' or event is None:
break
progress_bar.UpdateBar(i + 1)
window.close()

此處依然是使用的for循環(huán)將進(jìn)度條填滿。下面使用線程模擬任務(wù)進(jìn)度完成。
三、模擬任務(wù)完成度 進(jìn)度條
使用線程模擬任務(wù)進(jìn)度完成。當(dāng)然,沒(méi)有現(xiàn)實(shí)的任務(wù),所以還是使用for循環(huán)加休眠組成。。。當(dāng)然,與原來(lái)還是有區(qū)別的。因?yàn)槿蝿?wù)在線程內(nèi)完成,完成后需要通知主線程進(jìn)度條更新。
import random
import time
from queue import Empty
import PySimpleGUI as sg
import threading
import queue
# 布局,是一個(gè)用戶定義的二維列表。
# 第一維德元素分居不同的行上,第二維度上的元素們居于同一行,不同列上
# 此處定義的列表 由三部分組成 Text文件 ProgressBar進(jìn)度條 Cancel取消按鈕構(gòu)成
layout = [[sg.Text('任務(wù)完成進(jìn)度')],
[sg.ProgressBar(100, orientation='h', size=(50, 20), key='progressbar')],
[sg.Cancel()]]
# window只需將自定義的布局加載出來(lái)即可 第一個(gè)參數(shù)是窗口標(biāo)題。
window = sg.Window('機(jī)器人執(zhí)行進(jìn)度', layout)
# 根據(jù)key值獲取到進(jìn)度條
progress_bar = window['progressbar']
# 隊(duì)列 后進(jìn)先出
q = queue.Queue()
def task_1():
global q
for i in range(100):
# 因?yàn)橐笥趙indow.read設(shè)置超時(shí)時(shí)間100ms 保證讀取時(shí)隊(duì)列最多只有一個(gè)元素
time.sleep(random.random() + 0.1)
q.put(i+1) # 向隊(duì)列中放入當(dāng)前任務(wù)完成度
# 創(chuàng)建多線程 設(shè)置以保護(hù)模式啟動(dòng),即主線程運(yùn)行結(jié)束,子線程也停止運(yùn)行
worker_task = threading.Thread(target=task_1)
worker_task.setDaemon(True)
worker_task.start()
while True: # 死循環(huán)不斷讀取隊(duì)列中數(shù)據(jù),直到讀到100
# event 就是返回的事件
# 如點(diǎn)擊Cancel后 event=Cancel
event, values = window.read(timeout=100)
if event == 'Cancel' or event is None:
# 點(diǎn)擊取消按鈕或者返回事件為 None
break
# 10ms 無(wú)操作算超時(shí)event會(huì)等于 __TIMEOUT__
# 其實(shí)不用判斷
try:
# get是等待讀取,直到讀取到數(shù)據(jù)
# get_nowait 不等待,讀取不到數(shù)據(jù) 就報(bào)異常
progress_value = q.get_nowait()
except Empty:# 沒(méi)有讀取到數(shù)據(jù)的話,繼續(xù)window.read
continue
else:# 讀取到數(shù)據(jù)
progress_bar.UpdateBar(progress_value)
if progress_value == 100:# 進(jìn)度滿跳出循環(huán)
break
window.close()

以上就是python使用PySimpleGUI設(shè)置進(jìn)度條的詳細(xì)內(nèi)容,更多關(guān)于python PySimpleGUI進(jìn)度條的資料請(qǐng)關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信