Tkinter:文本小部件回调引用了错误的小部件

问题描述 投票:0回答:1

我有一个

Tkinter
窗口,其中包含一些
Text
小部件。这些小部件:

  1. StringVar
    列表创建(每个列表元素 1 个小部件,数量根据列表长度而定)。
  2. 显示对应
    StringVar
    的文字。
  3. 其背景颜色由相应
    StringVar
    的文本定义。
  4. 按下键盘上的“Return”键时调用函数
    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()
python tkinter text-widget
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.