python使用PySimpleGUI設(shè)置進度條及控件使用
PySimpleGUI 使用起來感覺比tkinter要方便,當(dāng)然我也沒怎么用過這兩者。只是學(xué)習(xí)模擬一下任務(wù)進度完成情況。
安裝
pip install PySimpleGUI
一、簡單進度條使用
PySimpleGUI有一個一條命令即可展示進度條的控件。one_line_progress_meter
import time import PySimpleGUI as sg if __name__ == '__main__': sg.one_line_progress_meter('進度條標(biāo)題', 10, 100, 'key1', '內(nèi)容') # sg.one_line_progress_meter() time.sleep(10)
基本參數(shù)
前面的參數(shù)分別代表
進度條標(biāo)題,
進度條當(dāng)前進度,
進度條最大進度,
進度條的 key, (key相同代表是同一個進度條)
進度條傳入?yún)?shù)(可以是多個非關(guān)鍵字參數(shù))。
sg.one_line_progress_meter('進度條標(biāo)題', 10, 100, 'key1', '內(nèi)容1')
其它常用參數(shù)orientation
由于參數(shù)*args 的存在,調(diào)用時如果希望傳入自定義參數(shù),那么前面的基本參數(shù)需要使用非關(guān)鍵字形式傳入。當(dāng)然也可以不傳入自定義參數(shù)。
orientation 表示 進度條是橫向的或是縱向的。
h橫向 v縱向(默認(rèn))
sg.one_line_progress_meter(title='進度條標(biāo)題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 完成了千分之一的任務(wù) sg.one_line_progress_meter( '進度條', i+1, 1000, 'key', '測試使用進度條', orientation='h' )
此處休眠時間可以當(dāng)做完成任務(wù)的時間。沒完成一點任務(wù)進度條就會增加。
但實際上真正運行時有很多耗時任務(wù)執(zhí)行時會阻塞進度條。使進度條陷入未響應(yīng)狀態(tài)(如第一個圖片)。所以一般會把耗時任務(wù)使用多線程執(zhí)行,執(zhí)行完成后想辦法通知進度條更新狀態(tài)。注(PySimpleGUI組件需要運行在主線程,參見源文檔說明)
one_line_progress_meter雖然方便,但樣式無法控制,其上也有很多不關(guān)心的顯示無法去除。。。
附。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('幾秒后自動關(guān)閉的彈窗') sg.popup_auto_close('10秒后自動關(guān)閉的彈窗', auto_close_duration=10)
二、進度條控件使用
普通方法展示進度條控件。需要大概知曉布局和窗口的關(guān)系。
import PySimpleGUI as sg # 布局,是一個用戶定義的二維列表。 # 第一維德元素分居不同的行上,第二維度上的元素們居于同一行,不同列上 # 此處定義的列表 由三部分組成 Text文件 ProgressBar進度條 Cancel取消按鈕構(gòu)成 # Text Progress等有各自的參數(shù)設(shè)置,如size等。此處不再贅述 layout = [[sg.Text('任務(wù)完成進度')], [sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progressbar')], [sg.Cancel()]] # window只需將自定義的布局加載出來即可 第一個參數(shù)是窗口標(biāo)題。 window = sg.Window('機器人執(zhí)行進度', layout) # 根據(jù)key值獲取到進度條 progress_bar = window['progressbar'] # window的read函數(shù)分為同步和異步, # 不帶timeout參數(shù)即為同步函數(shù) 一直等到手動點擊按鈕才會返回。 # 帶timeout參數(shù)不為None的為異步函數(shù),timeout時間內(nèi)無時間或者點擊了按鈕都會產(chǎn)生結(jié)果。 # 異步方式不會阻塞后面的程序運行。 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)將進度條填滿。下面使用線程模擬任務(wù)進度完成。
三、模擬任務(wù)完成度 進度條
使用線程模擬任務(wù)進度完成。當(dāng)然,沒有現(xiàn)實的任務(wù),所以還是使用for循環(huán)加休眠組成。。。當(dāng)然,與原來還是有區(qū)別的。因為任務(wù)在線程內(nèi)完成,完成后需要通知主線程進度條更新。
import random import time from queue import Empty import PySimpleGUI as sg import threading import queue # 布局,是一個用戶定義的二維列表。 # 第一維德元素分居不同的行上,第二維度上的元素們居于同一行,不同列上 # 此處定義的列表 由三部分組成 Text文件 ProgressBar進度條 Cancel取消按鈕構(gòu)成 layout = [[sg.Text('任務(wù)完成進度')], [sg.ProgressBar(100, orientation='h', size=(50, 20), key='progressbar')], [sg.Cancel()]] # window只需將自定義的布局加載出來即可 第一個參數(shù)是窗口標(biāo)題。 window = sg.Window('機器人執(zhí)行進度', layout) # 根據(jù)key值獲取到進度條 progress_bar = window['progressbar'] # 隊列 后進先出 q = queue.Queue() def task_1(): global q for i in range(100): # 因為要大于window.read設(shè)置超時時間100ms 保證讀取時隊列最多只有一個元素 time.sleep(random.random() + 0.1) q.put(i+1) # 向隊列中放入當(dāng)前任務(wù)完成度 # 創(chuàng)建多線程 設(shè)置以保護模式啟動,即主線程運行結(jié)束,子線程也停止運行 worker_task = threading.Thread(target=task_1) worker_task.setDaemon(True) worker_task.start() while True: # 死循環(huán)不斷讀取隊列中數(shù)據(jù),直到讀到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是等待讀取,直到讀取到數(shù)據(jù) # get_nowait 不等待,讀取不到數(shù)據(jù) 就報異常 progress_value = q.get_nowait() except Empty: # 沒有讀取到數(shù)據(jù)的話,繼續(xù)window.read continue else: # 讀取到數(shù)據(jù) progress_bar.UpdateBar(progress_value) if progress_value == 100: # 進度滿跳出循環(huán) break window.close()
以上就是python使用PySimpleGUI設(shè)置進度條的詳細(xì)內(nèi)容,更多關(guān)于python PySimpleGUI進度條的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python qqbot 實現(xiàn)qq機器人的示例代碼
這篇文章主要介紹了Python qqbot 實現(xiàn)qq機器人的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07部署django項目安裝uwsgi出錯的解決方法總結(jié)
uwsgi協(xié)議是一個uWSGI服務(wù)器自有的協(xié)議,它用于定義傳輸信息的類型(type of information),每一個uwsgi packet前4byte為傳輸信息類型描述,它與WSGI相比是兩樣?xùn)|西,下面這篇文章主要給大家介紹了關(guān)于部署django項目安裝uwsgi出錯的解決方法,需要的朋友可以參考下2022-08-08tensorflow 2.1.0 安裝與實戰(zhàn)教程(CASIA FACE v5)
這篇文章主要介紹了tensorflow 2.1.0 安裝與實戰(zhàn)(CASIA FACE v5),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06python spilt()分隔字符串的實現(xiàn)示例
split() 方法可以實現(xiàn)將一個字符串按照指定的分隔符切分成多個子串,本文介紹了spilt的具體使用,感興趣的可以了解一下2021-05-05