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)

進度條1

基本參數
前面的參數分別代表
進度條標題,
進度條當前進度,
進度條最大進度,
進度條的 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')

進度條2

模擬進度條一步步填滿

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'
        )

進度條3

此處休眠時間可以當做完成任務的時間。沒完成一點任務進度條就會增加。

但實際上真正運行時有很多耗時任務執行時會阻塞進度條。使進度條陷入未響應狀態(如第一個圖片)。所以一般會把耗時任務使用多線程執行,執行完成後想辦法通知進度條更新狀態。註(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()

進度條4

此處依然是使用的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其它相關文章!

推薦閱讀: