Как задать идентификатор кнопки при вызове функции создания кнопки - PullRequest
1 голос
/ 22 мая 2019

Прошу прощения за мое невежество, поскольку я новичок в 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

1 Ответ

0 голосов
/ 22 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...