将 tkinter 小部件绑定到包含 args 的函数 - Lambda 的使用
Bind a tkinter widget to a function containing args - Use of Lambda
有一个列表:
liste_physical_activity.insert(1, pa1)
liste_physical_activity.insert(2, pa2)
liste_physical_activity.bind('<<ListboxSelect>>', CurSelet_physical_activity)
liste_physical_activity.pack()
链接到以下函数:
def CurSelet_physical_activity(event, window_mother):
# stuff
即使使用 lambda 也不起作用:
<<ListboxSelect>>', lambda event,
window_mother=main_window CurSelet_physical_activity (event, window_mother))
问题是 main_window
已经在另一个 file.py
中创建了,所以他不知道。
我该如何解决这个问题?
编辑参考问题:
main.py
from Energy_Requirement import*
main_window =Tk()
bouton_energy_requirement= Button(main_window, text="Estimation of energy requirement", command=lambda:energy_requirement(main_window))
bouton_energy_requirement.pack()
file1.py
def energy_requirement(window_mother):
pa1="NRC"
pa2="Kornfeld"
window5=Toplevel(window_mother)
liste_physical_activity = Listbox(window5,width=80, height=5)
liste_physical_activity.insert(1, pa1)
liste_physical_activity.insert(2, pa2)
liste_physical_activity.bind('<<ListboxSelect>>', CurSelet_physical_activity)
liste_physical_activity.pack()
def CurSelet_physical_activity(event):
global liste_physical_activity
value=str(liste_physical_activity.get(liste_physical_activity.curselection()))
if value==pa1:
ER=1
label = Label(main_window, text="Energy Requirement (kcal ME/day)")
label.pack()
show_ER=StringVar()
show_ER.set(ER)
entree_ER = Entry(main_window,textvariable=show_ER,width=30)
entree_ER.pack()
if value==pa2:
ER=2
label = Label(main_window, text=" Energy Requirement (kcal ME/day)")
label.pack()
show_ER=StringVar()
show_ER.set(ER)
entree_ER = Entry(main_window,textvariable=show_ER,width=30)
entree_ER.pack()
energy_requirement
正在传递对 main_window
的引用,因此您需要做的就是在绑定中传递该值。这应该有效:
def energy_requirement(window_mother):
...
liste_physical_activity.bind('<<ListboxSelect>>',
lambda event, mw=window_mother: CurSelet_physical_activity(event, mw))
然后您需要修改 CurSelet_physical_activity
以接受此附加参数:
def CurSelet_physical_activity(event, main_window):
...
if value==pa1:
ER=1
label = Label(main_window, text="Energy Requirement (kcal ME/day)")
...
您似乎没有在 CurSelet_physical_activity
中的任何地方使用 event
,因此您可以根据需要将其从函数的绑定和参数列表中删除。
有一个列表:
liste_physical_activity.insert(1, pa1)
liste_physical_activity.insert(2, pa2)
liste_physical_activity.bind('<<ListboxSelect>>', CurSelet_physical_activity)
liste_physical_activity.pack()
链接到以下函数:
def CurSelet_physical_activity(event, window_mother):
# stuff
即使使用 lambda 也不起作用:
<<ListboxSelect>>', lambda event,
window_mother=main_window CurSelet_physical_activity (event, window_mother))
问题是 main_window
已经在另一个 file.py
中创建了,所以他不知道。
我该如何解决这个问题?
编辑参考问题:
main.py
from Energy_Requirement import*
main_window =Tk()
bouton_energy_requirement= Button(main_window, text="Estimation of energy requirement", command=lambda:energy_requirement(main_window))
bouton_energy_requirement.pack()
file1.py
def energy_requirement(window_mother):
pa1="NRC"
pa2="Kornfeld"
window5=Toplevel(window_mother)
liste_physical_activity = Listbox(window5,width=80, height=5)
liste_physical_activity.insert(1, pa1)
liste_physical_activity.insert(2, pa2)
liste_physical_activity.bind('<<ListboxSelect>>', CurSelet_physical_activity)
liste_physical_activity.pack()
def CurSelet_physical_activity(event):
global liste_physical_activity
value=str(liste_physical_activity.get(liste_physical_activity.curselection()))
if value==pa1:
ER=1
label = Label(main_window, text="Energy Requirement (kcal ME/day)")
label.pack()
show_ER=StringVar()
show_ER.set(ER)
entree_ER = Entry(main_window,textvariable=show_ER,width=30)
entree_ER.pack()
if value==pa2:
ER=2
label = Label(main_window, text=" Energy Requirement (kcal ME/day)")
label.pack()
show_ER=StringVar()
show_ER.set(ER)
entree_ER = Entry(main_window,textvariable=show_ER,width=30)
entree_ER.pack()
energy_requirement
正在传递对 main_window
的引用,因此您需要做的就是在绑定中传递该值。这应该有效:
def energy_requirement(window_mother):
...
liste_physical_activity.bind('<<ListboxSelect>>',
lambda event, mw=window_mother: CurSelet_physical_activity(event, mw))
然后您需要修改 CurSelet_physical_activity
以接受此附加参数:
def CurSelet_physical_activity(event, main_window):
...
if value==pa1:
ER=1
label = Label(main_window, text="Energy Requirement (kcal ME/day)")
...
您似乎没有在 CurSelet_physical_activity
中的任何地方使用 event
,因此您可以根据需要将其从函数的绑定和参数列表中删除。