我有一个
Tkinter
窗口,其中包含一些 Text
小部件。这些小部件:
StringVar
列表创建(每个列表元素 1 个小部件,数量根据列表长度而定)。StringVar
的文字。StringVar
的文本定义。analyse_display_callback_colour
。问题:
analyse_display_callback_colour
始终接收最后创建的小部件的index
。这意味着始终引用最后创建的小部件,而不是引用修改后的 Text
小部件。
有人可以解释一下如何触发按下“返回”键的小部件的功能
analyse_display_callback_colour
吗?
MWE
from tkinter import StringVar, Text, END, Tk
def analyse_display_callback_colour(event,widgets,index):
print(widgets[index])
############### MAIN CODE ###############
window_main = Tk()
colours = [StringVar(window_main,"deep sky blue"),StringVar(window_main,"forest green"),StringVar(window_main,"red")]
colours_widgets = []
for n in range(0,len(colours)):
colours_widgets.append(Text(window_main, width=15, height=1, bg=colours[n].get()))
colours_widgets[n].insert(END,colours[n].get())
colours_widgets[n].bind('<Return>', lambda e:analyse_display_callback_colour(event=e,widgets=colours_widgets,index=n))
colours_widgets[n].grid(column=0,row=n)
window_main.mainloop()
lambda函数通过
引用而不是值捕获
n
。当调用 lambda 函数时,循环已经完成,并且 n
处于所有函数的 最后一个值。
更正:
from tkinter import StringVar, Text, END, Tk
def analyse_display_callback_colour(event,widgets,index):
print(widgets[index])
window_main = Tk()
colours = [StringVar(window_main,"deep sky blue"), StringVar(window_main,"forest green"), StringVar(window_main,"red")]
colours_widgets = []
for n in range(0,len(colours)):
colours_widgets.append(Text(window_main, width=15, height=1, bg=colours[n].get()))
colours_widgets[n].insert(END,colours[n].get())
colours_widgets[n].bind('<Return>', lambda e, n=n: analyse_display_callback_colour(event=e,widgets=colours_widgets,index=n))
colours_widgets[n].grid(column=0,row=n)
window_main.mainloop()