Не привязать запись в файл в Bind к wx.Button кнопкам в цикле

Приветствую уважаемое сообщество!

У меня следующая задача: нужно создать панель с кнопками, названия для которых взять из файла (all_classes). При нажатии на каждую из них лейбл кнопки должен записываться в другой файл (chosen_classes). У меня получилось создать кнопки в цикле и расположить их на панели, но событие записи к кнопке не привязываются и я не понимаю почему.

all_classes = open('data/yolo2/yolo2.names', 'r').read().split()
chosen_classes = open('chosen_classes', 'w')

deltaxSize, deltaySize, c = 0, 0, 0
        for k, obj_class in enumerate(all_classes):
            self.buttons.append(wx.Button(self.panel, label=f'{obj_class}', pos=(50 + deltaxSize, 20 + deltaySize),
                                       size=(100, 20)))
            self.Bind(wx.EVT_BUTTON, lambda event: chosen_classes.write(f'{obj_class}\n'), self.buttons[k])
            deltaySize += 20
            c += 1
            if c == 30:
                deltaxSize += 100
                deltaySize, c = 0, 0

Я попробовал вместо записи запустить в лямбду просто принты чтобы проверить в чём дело, но получил странный результат: при нажатии на любую кнопку выводится только последний лейбл:

deltaxSize, deltaySize, c = 0, 0, 0
        self.buttons = []
        for k, obj_class in enumerate(all_classes):
            self.buttons.append(wx.Button(self.panel, label=f'{obj_class}', pos=(50 + deltaxSize, 20 + deltaySize),
                                       size=(100, 20)))
            self.Bind(wx.EVT_BUTTON, lambda event: print(f'{obj_class}\n'), self.buttons[k])
            deltaySize += 20
            c += 1
            if c == 30:
                deltaxSize += 100
                deltaySize, c = 0, 0

То же самое происходит если в f-строке заменить obj_class на self.buttons[k].GetLabelText() При этом если обратиться вне цикла к каждой кнопки в отдельности, то напечатать лейбл получается, а вот запись в файл всё равно не происходит. Я в полном, признаться, недоумении, если кто-нибудь что-нибудь сможет подсказать, буду бесконечно признателен. Спасибо.


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

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

Здесь можно почитать про причину проблемы.

self.Bind(wx.EVT_BUTTON, lambda event, k=k, obj_class=obj_class: print(f'{obj_class}\n'), self.buttons[k])
→ Ссылка