Не понимаю ошибку в PyCharm

Работаю на PyCharm, пишу определённое приложение. Привожу код

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QComboBox

class Main_widget(QWidget):
   def __init__(self):
       super().__init__()
       self.ui()
   def ui(self):
       self.b_list = 0
       self.act_btn = QPushButton()
       self.act_btn.clicked.connect(self.add_combo)
   def open_win(self, obj):
       if obj.currentText() == 'delay':
       # ...

   def add_combo(self):
       exec('self.act_b' + str(self.b_list) + ' = QComboBox()')
       exec('self.act_b' + str(self.b_list) + '.activated.connect(lambda: self.open_win(self.act_b' + str(self.b_list) + '))')

if __name__ == '__main__':
   app = QApplication([])
   win = Main_widget()
   app.exec_()

После добавления строки exec('self.act_b' + str(self.b_list) + '.activated.connect(lambda: self.open_win(self.act_b' + str(self.b_list) + '))') начало выдавать ошибку

Traceback (most recent call last):
  File "string", line 1, in lambda
NameError: name 'self' is not defined

Предварительно переменную self.act_b0 я обозначил. Помогите разобраться


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

Автор решения: insolor

Не используйте нумерованные поля объекта (или нумерованные переменные), используйте просто список. Должно получиться примерно так:

class Main_widget(QWidget):
   def __init__(self):
       super().__init__()
       self.ui()
   def ui(self):
       self.act_b = []
       self.act_btn = QPushButton()
       self.act_btn.clicked.connect(self.add_combo)
   def open_win(self, obj):
       if obj.currentText() == 'delay':
           ...

   def add_combo(self):
       combo = QComboBox()
       combo.activated.connect(lambda: self.open_win(combo))
       self.act_b.append(combo)

Обращение к конкретному комбо в списке - просто по индексу, типа self.act_b[0], без всех этих exec.

→ Ссылка