#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
опции ofOptionMenu
будет передан выбранному значению при его выполнении, поэтому значение по умолчанию использоваться не будет.