iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0

QProgressBar 是 PyQt5 裡的進度條元件,這篇教學會介紹如何在 PyQt5 視窗裡加入 QProgressBar 進度條,並實做使用進度條顯示目前進度的簡單應用。

原文參考:QProgressBar 進度條

因為 Google Colab 不支援 PyQt5,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。

QProgressBar 進度條

加入 QProgressBar 進度條

建立 PyQt5 視窗物件後,透過 QtWidgets.QProgressBar(widget) 方法,就能在指定的元件中建立進度條

from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)

Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)

bar = QtWidgets.QProgressBar(Form)
bar.move(20,20)
bar.setRange(0, 100)    # 進度條範圍
bar.setValue(50)        # 進度條預設值

Form.show()
sys.exit(app.exec_())

Python 教學 - QProgressBar 進度條

QProgressBar 樣式設定

透過 setStyleSheet() 方法,可以使用類似網頁的 CSS 語法設定 QProgressBar 樣式,下方的程式碼執行後,會將兩個 QProgressBar 設定為不同樣式 ( QProgressBar::chunk 表示目前進度條位置,width 設定為 1 ),根據作業系統的不同,例如 MacOS 要在設定樣式後,才會出現進度百分比的文字

from PyQt5 import QtWidgets, QtCore
import sys
app = QtWidgets.QApplication(sys.argv)

Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)

bar1 = QtWidgets.QProgressBar(Form)
bar1.move(20,20)
bar1.setRange(0, 100)
bar1.setValue(50)
bar1.setStyleSheet('''
    QProgressBar {
        border: 2px solid #000;
        border-radius: 5px;
        text-align:center;
        height: 50px;
        width:80px;
    }
    QProgressBar::chunk {
        background: #09c;
        width:1px;
    }
''')

bar2 = QtWidgets.QProgressBar(Form)
bar2.move(120,20)
bar2.setRange(0, 100)
bar2.setValue(50)
bar2.setStyleSheet('''
    QProgressBar {
        border: 2px solid #000;
        text-align:center;
        background:#aaa;
        color:#fff;
        height: 15px;
        border-radius: 8px;
        width:150px;
    }
    QProgressBar::chunk {
        background: #333;
        width:1px;
    }
''')

Form.show()
sys.exit(app.exec_())

Python 教學 - QProgressBar 進度條

QProgressBar 進度文字設定

QProgressBar 提供三種文字的顯示格式,透過三種文字顯示格式,能讓進度條的顯示更多變化。

顯示格式 說明
%p 百分比
%v 目前數值
%m 總數值

下方的程式碼執行後,會出現三個不同顯示格式的進度條。

from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)

Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)

style = '''
    QProgressBar {
        border: 2px solid #000;
        border-radius: 5px;
        text-align:center;
        height: 20px;
        width:200px;
    }
    QProgressBar::chunk {
        background: #09c;
        width:1px;
    }
'''

bar1 = QtWidgets.QProgressBar(Form)
bar1.move(20,20)
bar1.setRange(0, 200)
bar1.setValue(50)
bar1.setStyleSheet(style)
bar1.setFormat('%v/%m')

bar2 = QtWidgets.QProgressBar(Form)
bar2.move(20,60)
bar2.setRange(0, 200)
bar2.setValue(50)
bar2.setStyleSheet(style)
bar2.setFormat('%p%')

bar3 = QtWidgets.QProgressBar(Form)
bar3.move(20,100)
bar3.setRange(0, 200)
bar3.setValue(50)
bar3.setStyleSheet(style)
bar3.setFormat('%v')

Form.show()
sys.exit(app.exec_())

Python 教學 - QProgressBar 進度條

QProgressBar 常用方法

下方列出 QSlider 數值調整滑桿的常用方法:

方法 參數 說明
setValue() int 設定進度。
setRange() min, max 設定進度範圍。
setFormat() format 設定進度文字格式。
reset() 重設進度條數值。

如果將 setValue() 方法中的最小值與最大值設定為「相同數值」,進度條就會呈現「不斷載入」的狀態。

from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)

Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)

style = '''
    QProgressBar {
        border: 2px solid #000;
        border-radius: 5px;
        text-align:center;
        height: 20px;
        width:200px;
    }
    QProgressBar::chunk {
        background: #09c;
        width:1px;
    }
'''

bar = QtWidgets.QProgressBar(Form)
bar.move(20,20)
bar.setRange(0, 0)       # 兩個數值設定相同
bar.setValue(50)
bar.setStyleSheet(style)

Form.show()
sys.exit(app.exec_())

Python 教學 - QProgressBar 進度條

點擊按鈕增加進度

下方的程式碼執行後,會在畫面中增加兩顆按鈕,一顆按鈕按下時會增加進度,另外一顆按鈕按下時則會重設進度。

from PyQt5 import QtWidgets
import sys
app = QtWidgets.QApplication(sys.argv)

Form = QtWidgets.QWidget()
Form.setWindowTitle('oxxo.studio')
Form.resize(300, 200)

style = '''
    QProgressBar {
        border: 2px solid #000;
        border-radius: 5px;
        text-align:center;
        height: 20px;
        width:200px;
    }
    QProgressBar::chunk {
        background: #09c;
        width:1px;
    }
'''

bar = QtWidgets.QProgressBar(Form)
bar.move(20,20)
bar.setRange(0, 200)
bar.setValue(0)
bar.setStyleSheet(style)

n = 0
def more():
    global n
    n = n + 10
    bar.setValue(n)      # 增加進度

def reset():
    global n
    n = 0
    bar.reset()          # 重設進度

btn1 = QtWidgets.QPushButton(Form)   # 增加進度按鈕
btn1.move(20,60)
btn1.setText('增加進度')
btn1.clicked.connect(more)

btn2 = QtWidgets.QPushButton(Form)   # 重設進度按鈕
btn2.move(110,60)
btn2.setText('重設')
btn2.clicked.connect(reset)


Form.show()
sys.exit(app.exec_())

Python 教學 - QProgressBar 進度條

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 16 ) QSlider 數值調整滑桿
下一篇
( Day 18 ) QFileDialog 選擇檔案對話視窗
系列文
實戰 Python x PyQt5 軟體介面設計35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言