Как указать идентификатор кнопки при вызове функции создания кнопки

Пожалуйста, извините мое невежество, так как я новичок в 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
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Простое и быстрое решение — просто передать функции текущее 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() при нажатии кнопки.

Большое спасибо за ваш ответ! Я только что попытался реализовать ваше предложение и теперь получаю следующую ошибку для этого изменения команды: AttributeError: объект 'int' не имеет атрибута 'get'

JumpingJacks 22.05.2019 14:41

@Майк, я изменил код, я думал, ты использовал IntVar() вместо RowCounter, теперь он должен работать :). Теперь вам нужно, чтобы функция execute принимала счетчик строк в качестве входных данных (например, def Execute(self, rc):

MatthewG 22.05.2019 14:42

Это еще не работает для меня - нет ошибки, но если я добавлю две строки и нажму кнопку в первой строке, он все равно будет думать, что значение строки равно 2, когда оно должно быть 1

JumpingJacks 22.05.2019 14:58

Неважно, я понял, что я делаю неправильно, это отличное решение. Большое спасибо за вашу помощь! это ценится

JumpingJacks 22.05.2019 15:00

Другие вопросы по теме