Будет ли функционировать кнопка tkinter в функции при использовании лямбды в качестве команды? - PullRequest
0 голосов
/ 24 июня 2019

Я создавал приложение, используя Tkinter для создания экземпляра GUI.Я пытаюсь сделать его объектно-ориентированным, чтобы код можно было использовать где-то еще, чтобы упростить использование Tkinter.Проблема, с которой я столкнулся, заключается в возможности вызова сложных функций с аргументами для команд кнопок.

Я пытался узнать как можно больше о кнопках.Я читал и смотрел видео о том, как привязать команду к конкретным щелчкам мыши и передать функцию, используя частичное, чтобы сломать функцию.Эти параметры не будут соответствовать текущей архитектуре кода.Последняя идея, которую я пытался использовать lambda для создания временной функции.

def add_button(self, title, command, where, frame):
    button = ttk.Button(frame, text=title,command=lambda: command)
    button.pack(side=where, fill='both', expand=True)
    return button

Это класс, который создает страницу с нужными виджетами.

class StartPage(Page):

    def __init__(self, container, controller):
        super().__init__(container, controller)

        title_frame = tk.LabelFrame(self, text='StartPage')
        title_frame.pack(side='top')
        title = tk.Label(title_frame, text='EPA Engine Report Filing', font=('Helvetica', 16))
        title.pack(side='bottom', pady=25)

        buttons = {'Quit': quit(), 'Stuff': do_something()}

        button_frame = tk.Frame(self)
        button_frame.pack(side='top', pady=75)

        for button, command in buttons.items():
            self.add_button(button, command, 'bottom', button_frame)

Мой конкретный вопрос заключается в следующемкогда цикл for выполняет итерацию по словарю, объявленному как кнопки в StartPage.__init__, перезаписывают ли лямбда-функции для кнопки 'Stuff' лямбда-функцию для предыдущей кнопки 'quit'?Если это так, то последняя созданная кнопка будет единственной кнопкой для работы, если я понимаю лямбду.Когда этот код запускается, ничего не появляется.Когда функции для кнопок не имеют скобок, появляется начальное окно, но кнопки ничего не делают.

Спасибо за чтение и за любые советы, которые вы можете дать.

1 Ответ

3 голосов
/ 24 июня 2019

В вашем коде есть пара проблем.

Во-первых, использование lambda неправильно.Когда вы делаете lambda: command, лямбда ничего не делает.Если вы хотите, чтобы лямбда вызывала команду, вам нужно использовать круглые скобки, чтобы сообщить Python о выполнении функции (например: lambda: command()).Однако, если вы не передаете никаких аргументов, то lambda сам по себе не имеет смысла.Вы можете просто привязать команду непосредственно к кнопке (например: command=command).

Другая проблема заключается в том, что вы неправильно определяете buttons.Рассмотрим этот код:

buttons = {'Quit': quit(), 'Stuff': do_something()}

Приведенный выше код функционально идентичен этому:

result1 = quit()
result2 = do_something()
buttons = {'Quit': result1, 'Stuff': result2}

Во всех случаях вам необходимо передать ссылку в функцию,Например, это должно работать:

buttons = {'Quit': quit, 'Stuff': do_something}
...
def add_button(self, title, command, where, frame):
    button = ttk.Button(frame, text=title,command=command)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...