self.a = QtGui.QRadioButton()
self.b = QtGui.QRadioButton()
, когда у меня есть массив: обр = [ «а», «б», «в» ..... «х», «г»]Как создать флажок или переключатель в python?
как я его создать более эффективный вместо из 26 раз?
self.a = QtGui.QRadioButton()
self.b = QtGui.QRadioButton()
, когда у меня есть массив: обр = [ «а», «б», «в» ..... «х», «г»]Как создать флажок или переключатель в python?
как я его создать более эффективный вместо из 26 раз?
Очень часто вам не нужно указывать местную ссылку на ваши кнопки. В этом случае вы можете спокойно забыть их, если у них есть родительский виджет, который позаботится об их уничтожении.
Использование 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)
Не назначайте каждый переключатель для своей собственной переменной экземпляра в классе, использовать словарь вместо:
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>
возможно дубликат: http://stackoverflow.com/questions/16060899/alphabet-range-python – cel