iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
Python

一些Python可以做的事系列 第 3

[Python] QRadioButton 單選按鈕

  • 分享至 

  • xImage
  •  

QRadioButton 是 PyQt5 裡的單選按鈕元件

建立

  • 透過 QtWidgets.QRadioButton(widget) 方法,建立單選按鈕
  • 透過 QtWidgets.QButtonGroup(widget) 方法為多個 QRadioButton 進行分組

位置設定

跟上一篇 QLabel 一樣

  1. move(x,y) : 放在的父元件中的 xy 座標,x 往右為正,y 往下為正,尺寸根據內容自動延伸。
  2. setGeometry(x,y,w,h) : 放在的父元件中的 xy 座標和長寬尺寸,x 往右為正,y 往下為正,如果超過長寬尺寸,預設會被裁切無法顯示

狀態設定

透過下列幾種方式可以設定按鈕的狀態 :

  1. setDisabled(bool) : 是否停用,預設 False 為啟用
  2. setChecked(bool) : 是否勾選,預設 False 為不勾選,可設定 True 勾選,若同一組有多個勾選,則以最後一個為主
  3. toggle() : 勾選狀態切換

樣式設定

跟上一篇 QLabel 一樣,如果會使用網頁 CSS 語法,就能透過 setStyleSheet() 設定 QRadioButton 樣式

點擊事件

如果你要偵測哪個 QRadioButton 被選中,可以使用兩種常見的方法。

  1. 利用 QButtonGroupQRadioButton 放入同一個按鈕組中。當你使用 addButton() 方法添加按鈕時,可以為每個按鈕指定一個 ID。接著,透過 buttonClicked.connect(fn) 來連接按鈕點擊事件,這樣當按鈕被選中時,就能觸發指定的函數,並使用 checkedId() 方法來獲取選中的按鈕的 ID。在這種設置下,程式會在你選擇不同按鈕時,通過 QLabel 顯示對應按鈕的 ID。
  2. 使用 toggled() 方法來綁定函式到每個按鈕。這樣,你可以在按鈕狀態改變時執行相應的函式。在函式中,你可以使用 text() 方法獲取按鈕的顯示文字,並使用 isChecked() 方法來檢查按鈕的選中狀態。

實作

from PyQt5 import QtWidgets
from PyQt5 import QtCore
import sys

app = QtWidgets.QApplication(sys.argv)

Form = QtWidgets.QWidget()
Form.setWindowTitle('HELLO')
Form.resize(500, 700)

def state(rb):
    label_state.setText(rb.text() + ' : ' + str(rb.isChecked()))

# 點擊事件 使用 toggled() 的方法,將函式與各個按鈕綁定
rb_A = QtWidgets.QRadioButton(Form)        # 單選按鈕 A
rb_A.setGeometry(180, 230, 100, 50)
rb_A.setText('A')
rb_A.toggled.connect(lambda: state(rb_A))  # 綁定函式
# 設定按鈕 A 的樣式
rb_A.setStyleSheet('''
    QRadioButton {
        color: #00f;
        font-size: 34px;  
    }
    QRadioButton:hover {
        color:#f00;
    }
''')

rb_a = QtWidgets.QRadioButton(Form)    # 單選按鈕 a
rb_a.setGeometry(180, 300, 100, 50)
rb_a.setText('a')
rb_a.setDisabled(True)                 # 按鈕 a 會停用
rb_a.setStyleSheet('''
    QRadioButton {
        color: #00f;
    }
    QRadioButton:hover {
        color:#f00;
    }
    QRadioButton:disabled {
        color:#ccc;
    }
''')

rb_x = QtWidgets.QRadioButton(Form)         # 單選按鈕 x
rb_x.setGeometry(180, 370, 100, 50)
rb_x.setText('x')
rb_x.toggled.connect(lambda: state(rb_x))   # 綁定函式

group1 = QtWidgets.QButtonGroup(Form)  # 按鈕群組
group1.addButton(rb_A)                 # 加入單選按鈕 A
group1.addButton(rb_a)                 # 加入單選按鈕 a
group1.addButton(rb_x)                 # 加入單選按鈕 x

label_state = QtWidgets.QLabel(Form)
label_state.setGeometry(180, 200, 100, 20)

rb_B = QtWidgets.QRadioButton(Form)    # 單選按鈕 B
rb_B.setGeometry(280, 230, 100, 50)
rb_B.setText('B')

rb_b = QtWidgets.QRadioButton(Form)    # 單選按鈕 b
rb_b.setGeometry(280, 300, 100, 50)
rb_b.setText('b')
rb_b.setChecked(True)                  # 按鈕 b 會預先勾選


def show():
    label_2.setText(str(group2.checkedId()))

# 點擊事件 使用 addButton() 添加按鈕時,可設定第二個按鈕的 ID 參數
group2 = QtWidgets.QButtonGroup(Form)  # 按鈕群組
group2.addButton(rb_B,1)               # 加入單選按鈕 B , ID 設定為 1
group2.addButton(rb_b,2)               # 加入單選按鈕 b , ID 設定為 2
group2.buttonClicked.connect(show)     # 綁定點擊事件

label_2 = QtWidgets.QLabel(Form)
label_2.setGeometry(350, 270, 100, 50)

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

圖示 :

https://ithelp.ithome.com.tw/upload/images/20240812/20168345MuprgRJReE.png

參考資料 :
https://steam.oxxostudio.tw/category/python/pyqt5/qradiobutton.html


上一篇
[Python] QLabel 跟 QPushButton
下一篇
[Python] 批量更改檔案名稱和轉檔
系列文
一些Python可以做的事19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言