Не привязать запись в файл в 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 шт):
Здесь можно почитать про причину проблемы.
self.Bind(wx.EVT_BUTTON, lambda event, k=k, obj_class=obj_class: print(f'{obj_class}\n'), self.buttons[k])