Как использовать переменную для обращения к виджетам по порядковому номеру?

Пишу свой первый проект на Python + PyQt столкнулся с такой проблемой:

def comboBox_add_data(self):
    """ функция добавления данных полей чек бокса
        :return:
    """
    cb_num = "1"
    for i in range(62):
        self.comboBox_window.comboBox_[cb_num].addItem("")
        self.comboBox_window.comboBox_[cb_num].setItemText(i, str(cb_list[i]))

в ответ получаю:

AttributeError: 'QMainWindow' object has no attribute 'comboBox_'

Если писать так, то все работает:

    self.comboBox_window.comboBox_1.addItem("")
    self.comboBox_window.comboBox_1.setItemText(i, str(cb_list[i]))

main.py:

from PyQt6.QtWidgets import QApplication, QWidget
from PyQt6 import uic
import sys

cb_list = ['null', 'ВРЕМЯ', 'ЗАПРС', 'ВЗН1', 'ВЗН2', 'ВЗС1', 'ВЗС2', 
    'ВЗП1', 'ВЗП2', 'ВВН1', 'ВВН2', 'ВВС1', 'ВВС2']

class App(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        self.comboBox_window = uic.loadUi('comboBox.ui')
        self.set()
    def set(self):
        self.comboBox_window.show()
        self.comboBox_add_data()
    def comboBox_add_data(self):
        """
        функция добавления данных в поля чекбокса
        :return:
        """
        cb_num = "1"
        for i in range(62):
            self.comboBox_window.comboBox_1.addItem("")
            self.comboBox_window.comboBox_1.setItemText(i, str(cb_list[i]))
            self.comboBox_window.comboBox_2.addItem("")
            self.comboBox_window.comboBox_2.setItemText(i, str(cb_list[i]))
            ######## вместо перечисления всех чекбоксов хотел бы использовать переменную равную порядковому номеру#####
           # self.comboBox_window.comboBox_[cb_num].addItem("")  # cb_num = "1"
           # self.comboBox_window.comboBox_[cb_num].setItemText(i, str(cb_list[i])) # cb_num = "1"
           # self.comboBox_window.comboBox_[cb_num].addItem("")  # cb_num = "2"
           # self.comboBox_window.comboBox_[cb_num].setItemText(i, str(cb_list[i])) # cb_num = "2"
           # ......


if __name__ == "__main__":
app = QApplication(sys.argv)
ex = App()
app.exec()

Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так:

import sys
'''
from PyQt6.QtWidgets import QApplication, QWidget                  # PyQt6
from PyQt6 import uic
'''
from PyQt5 import QtCore, QtGui, QtWidgets                         # PyQt5
from PyQt5.Qt import *


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
# ???        self.comboBox_window = uic.loadUi('comboBox.ui') # ??? comboBox.ui

        cb_list = [
            'null', 'ВРЕМЯ', 'ЗАПРС', 'ВЗН1', 'ВЗН2', 'ВЗС1', 'ВЗС2', 
            'ВЗП1', 'ВЗП2', 'ВВН1', 'ВВН2', 'ВВС1', 'ВВС2'
        ]
  
        many_cb = 62                     
        column = 9 
        layout = QGridLayout(self)
        
        for step in range(many_cb):
            comboBox = QComboBox(objectName=f'comboBox_{step}')
            comboBox.addItems(cb_list) 
            
            comboBox.activated.connect(
                lambda ind, cb=comboBox: self.comboBox_activate(ind, cb))

            row = step // column
            col = step % column
            layout.addWidget(comboBox, row, col)

    def comboBox_activate(self, index, comboBox):
        print(f'\n{comboBox.objectName()} \nindex={index}; text={comboBox.currentText()}') #
       
       
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exit(app.exec())

введите сюда описание изображения

→ Ссылка