python使用PySimpleGUI設置進度條及控件使用
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)
基本參數
前面的參數分別代表
進度條標題,
進度條當前進度,
進度條最大進度,
進度條的 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')
模擬進度條一步步填滿
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' )
此處休眠時間可以當做完成任務的時間。沒完成一點任務進度條就會增加。
但實際上真正運行時有很多耗時任務執行時會阻塞進度條。使進度條陷入未響應狀態(如第一個圖片)。所以一般會把耗時任務使用多線程執行,執行完成後想辦法通知進度條更新狀態。註(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()
此處依然是使用的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進度條的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python制作進度條的幾種方法
- Python制作進度條的四種方法總結
- 一個非常簡單好用的Python圖形界面庫(PysimpleGUI)
- 教你如何用一行Python代碼實現GUI圖形界面
- Python+OpenCV六種實時圖像處理詳細講解