Пожалуйста, извините мое невежество, так как я новичок в Python и экспериментирую.
Я создаю панель инструментов, которая позволяет пользователям открывать файл. Когда пользователь открывает файл, программное обеспечение добавляет строку с именем файла, индикатором выполнения и несколькими кнопками в одной строке. Создание строки выполняется путем вызова функции, которая увеличивает значение строки каждый раз, когда она вызывается, чтобы убедиться, что она не заменяет существующую строку, а вместо этого добавляет еще одну строку под ней, чтобы представить последний файл, открытый пользователем.
Допустим, на приборной панели есть две строки с соответствующими именами файлов и кнопками. Моя проблема в том, что когда я нажимаю кнопку в первом ряду, он думает, что я нажимаю кнопку во втором ряду просто потому, что счетчик установлен на 2 при добавлении второго ряда, и я пытаюсь определить, какая кнопка пользователь нажимает, проверяя строку, но не может этого сделать из-за счетчика.
Могу ли я в любом случае «привязать» значение строки к кнопке при ее объявлении при вызове функции кнопки создания, чтобы они сохраняли некоторую форму идентификатора, и я мог определить, с какой строкой взаимодействует пользователь?
Я попытался назначить кнопке идентификатор при вызове функции, чтобы определить, какая кнопка нажата и в какой строке, но кнопка перезаписывается во всех строках при повторном вызове функции.
Я также попытался проверить, какую кнопку нажимает пользователь, проверив текст кнопки, но это также перезаписывается при повторном вызове функции независимо от того, отличаются ли имена кнопок в самом пользовательском интерфейсе.
Любая помощь очень ценится. Надеюсь, я был достаточно ясен.
def OpenFile(self): # user opening file which creates row with button
print("Opening")
btnCreation(self)
def btnCreation(self): # function to create buttons dynamically
incrementFunction(self)
global EXEBtn
EXEBtn = Button(Main_frame,
text="Execute",
width=8,
command=self.Execute)
EXEBtn.grid(row=RowCounter, column=2, padx=3)
def incrementFunction(self):
global RowCounter
RowCounter = RowCounter + 1
def Execute(self):
# check which row the execute button was pressed on to do something
Простое и быстрое решение — просто передать функции текущее RowCounter
значение с помощью lambda
выражения, подобного этому:
def btnCreation(self): # function that creates button dynamically
incrementFunction(self)
global EXEBtn
EXEBtn = Button(Main_frame,
text="Execute",
width=8,
command=lambda e=RowCounter: self.Execute(e))
EXEBtn.grid(row=RowCounter, column=2, padx=3)
Конкретное изменение здесь command=lambda e=RowCounter.get(): self.Execute(e)
, изменяющее способ работы команды кнопок. По сути, это создание выражения lambda
, которое сохраняет значение RowCounter
, которое будет передано функции Execute()
при нажатии кнопки.
@Майк, я изменил код, я думал, ты использовал IntVar()
вместо RowCounter
, теперь он должен работать :). Теперь вам нужно, чтобы функция execute
принимала счетчик строк в качестве входных данных (например, def Execute(self, rc):
Это еще не работает для меня - нет ошибки, но если я добавлю две строки и нажму кнопку в первой строке, он все равно будет думать, что значение строки равно 2, когда оно должно быть 1
Неважно, я понял, что я делаю неправильно, это отличное решение. Большое спасибо за вашу помощь! это ценится
Большое спасибо за ваш ответ! Я только что попытался реализовать ваше предложение и теперь получаю следующую ошибку для этого изменения команды: AttributeError: объект 'int' не имеет атрибута 'get'