Параметр команды OptionMenu изменяется при вызове функции

#python #tkinter

Вопрос:

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

Вот пример кода. Когда я печатаю self.display , я получаю ожидаемое значение .!кадра, но после передачи его в качестве аргумента select и печати я получаю значение параметра, выбранного из выпадающего меню.

 import tkinter as tk

class menu(tk.Frame):
    def __init__(self, parent, display, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.display = display

        menu_frame = tk.Frame(self.parent)

        self.default_val = tk.StringVar()
        self.default_val.set("Default")

        print(self.display)
        menu = tk.OptionMenu(menu_frame, self.default_val, "A", "B", "C", command=lambda arg=self.display: self.select(arg))
        menu.pack()
        
        menu_frame.pack()
        
    def select(self, frame):
        print(frame)
        selection = self.default_val.get()
        self.default_val.set("Default")


app = tk.Tk()
app.geometry("400x200")
display_frame = tk.Frame(app)
display_frame.pack()

menu(app, display_frame)

app.mainloop()
 

Комментарии:

1. На самом деле это не связано с вашей проблемой, но почему вы наследуете от tk.Frame ? Кроме того, строка tk.Frame.__init__(self, parent, *args, **kwargs) бесполезна, потому что вы никогда не используете этот кадр

2. Нет никакой другой причины, кроме того, что я все еще изучаю классы в tkinter, я уверен, что мой проект с графическим интерфейсом изобилует глупыми ошибками, подобными этой

3. command=lambda x: self.select(self.display) , попробуешь это?

4. Идеальный. Спасибо, это работает. Могу я спросить, почему этот синтаксис работает, но не command=lambda arg=self.display: self.select(arg) работает ?

5. lambda arg=x: ... будет присвоено значение по умолчанию x arg , если lambda выполняется без указания arg . Однако обратный вызов для command опции of OptionMenu будет передан выбранному значению при его выполнении, поэтому значение по умолчанию использоваться не будет.