2015-04-04 138 views
1
self.a = QtGui.QRadioButton() 
self.b = QtGui.QRadioButton() 

當我有一個數組:ARR = [ 「一」, 「B」, 「C」 ...... 「×」, 「Z」]如何在python中創建複選框或單選按鈕?

如何創建它更有效,而不是26次?

+0

可能重複:http://stackoverflow.com/questions/16060899/alphabet-range-python – cel 2015-04-04 10:20:19

回答

1

很多時候,您不需要保留對按鈕的本地引用。在這種情況下,只要他們有一個能夠照顧他們的父控件,就可以放心地忘記他們。

使用QButtonGroup及其全局信號buttonClicked也將有助於以通用方式管理一組按鈕。但是您也可以使用partial將每個按鈕連接到單個插槽以傳輸用戶定義的數據,這些數據將幫助您確定哪個按鈕會生成回調。

import sys 
import string 
from PyQt5 import QtWidgets, QtCore 

class Window(QtWidgets.QDialog): 
    def __init__(self): 
     super().__init__() 
     self.setAttribute(QtCore.Qt.WA_DeleteOnClose) 

     self.letters = list(string.ascii_lowercase) 

     self.lay = QtWidgets.QVBoxLayout(self) 
     self.group = QtWidgets.QButtonGroup() 

     # Create all the buttons 
     for letter in self.letters: 
      btn = QtWidgets.QRadioButton(letter, self) 
      # In case you want to find it back later using findChild 
      btn.setObjectName("btn_"+letter) 
      self.group.addButton(btn) 
      self.lay.addWidget(btn) 

     self.group.buttonClicked.connect(self.btnCliked) 

    def btnCliked(self, btn): 
     # Do something with the button 
     print(btn.text()) 

def main(): 
    qApp = QtWidgets.QApplication(sys.argv) 
    win = Window() 
    win.show() 
    sys.exit(qApp.exec_()) 

if __name__ == '__main__': 
    main() 

partial實施例:

from functools import partial 

[...] 

for letter in self.letters: 
    btn = QtWidgets.QRadioButton(letter, self) 
    self.lay.addWidget(btn) 
    btn.clicked.connect(partial(self.btnClicked, letter)) 

[...] 

def btnCliked(self, letter): 
    print(letter) 
+0

只有一個複選框可以選擇? 我想選擇多個盒子......我怎麼寫? 謝謝 – manChan 2015-04-09 08:32:20

+0

http://doc.qt.io/qt-5/qbuttongroup.html#exclusive-prop – Cilyan 2015-04-10 12:56:54

1

每個單選按鈕不分配給自己的實例變量在類,使用,而不是一本字典:命名爲self.buttons

import string 
from QtGui import QRadioButton 

class RadioButtons(object):  
    def __init__(self, keys=string.ascii_lowercase): 
     self.buttons = {c: QRadioButton() for c in keys} 

這將創建一個字典(使用字典理解)作爲內的實例變量類RadioButtons的對象。您可以使用字典查詢進入各個按鈕:

rb.buttons['z'] 
>>> rb = RadioButtons() 
>>> rb.buttons['a'] 
<__main__.QRadioButton object at 0x7f576c3666d0> 
>>> rb.buttons['z'] 
<__main__.QRadioButton object at 0x7f576c36a550> 

字典是要走的路,但如果你真的必須有每個按鈕作爲一個實例變量,那麼你可以做這樣的事情:

class RadioButtons(object):  
    def __init__(self, keys=string.ascii_lowercase): 
     self.__dict__.update({c: QRadioButton() for c in keys}) 

>>> rb = RadioButtons() 
>>> rb.a 
<__main__.QRadioButton object at 0x7f576c3666d0> 
>>> rb.z 
<__main__.QRadioButton object at 0x7f576c36a550>