如何在python中创建复选框或单选按钮?

时间:2015-04-04 10:09:25

标签: python

 self.a = QtGui.QRadioButton()
 self.b = QtGui.QRadioButton()

当我有一个数组:arr = [“a”,“b”,“c”.....“x”,“z”]

如何更高效地创建它而不是26次?

2 个答案:

答案 0 :(得分:1)

不要将每个单选按钮分配给类中自己的实例变量,而是使用字典:

import string
from QtGui import QRadioButton

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

这将创建一个名为self.buttons的字典(使用字典理解)作为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>

答案 1 :(得分: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)