Python 从网格中的特定输入框获取文本并更新同一行中的组合框

Python 从网格中的特定输入框获取文本并更新同一行中的组合框,python,tkinter,Python,Tkinter,我使用for循环来创建文本框和组合框。我需要能够更改文本框(条目)中的文本,然后调用函数更新组合框中的项目。这是我正在使用的代码 def updatelist(updated_Num): ... ... new_list = [{'a':1},{'b':2},{'c':3}] options = tk.StringVar(root) for row, data in enumerate(all_data): entry = tk.Text(root, heigh

我使用for循环来创建文本框和组合框。我需要能够更改文本框(条目)中的文本,然后调用函数更新组合框中的项目。这是我正在使用的代码

def updatelist(updated_Num):
    ...
    ...
    new_list = [{'a':1},{'b':2},{'c':3}]

options = tk.StringVar(root)
for row, data in enumerate(all_data):
    entry = tk.Text(root, height=1.5, width=15)
    entry.bind('<Return>', lambda event: updateList(updated_Num=entry.get('1.0', 'end-1c')))
    entry.grid(row=row, column=1)

    options = [x for x in data[2]]
    variable.set(options[0])
    combobox = tk.ttk.Combobox(root, value=options, state='readonly')
    combobox.current(0)
    combobox.grid(row=row, column=2)
def updatelist(已更新的数量):
...
...
新列表=[{'a':1},{'b':2},{'c':3}]
options=tk.StringVar(根)
对于行,枚举中的数据(所有_数据):
entry=tk.Text(根,高度=1.5,宽度=15)
bind(“”,lambda事件:updateList(updated_Num=entry.get('1.0','end-1c'))
entry.grid(行=行,列=1)
选项=[x代表数据[2]中的x]
变量.set(选项[0])
combobox=tk.ttk.combobox(根,值=options,状态='readonly')
combobox.current(0)
combobox.grid(行=行,列=2)
我遇到的问题是,它总是从上次创建的输入框中获取文本,并从我按下enter键的任何输入框中删除文本

如何从输入数据的特定文本框中获取文本,以及如何更新该行中组合框的选项

编辑:这正是我想要的工作方式。谢谢你的帮助

def updatelist(updated_Num, row):
    ...
    ...
    new_list = [{'a':1},{'b':2},{'c':3}]

    options = tk.StringVar(root)
    options = [x for x in new_list]
    variable.set(options[0])
    combobox = tk.ttk.Combobox(root, value=options, state='readonly')
    combobox.current(0)
    combobox.grid(row=row, column=2)

options = tk.StringVar(root)
for row, data in enumerate(all_data):
    entry = tk.Text(root, height=1.5, width=15)
    entry.bind('<Return>', lambda event, entry=entry, row=row: updateList(updated_Num=entry.get('1.0', 'end-1c'), row=row))
    entry.grid(row=row, column=1)

    options = [x for x in data[2]]
    variable.set(options[0])
    combobox = tk.ttk.Combobox(root, value=options, state='readonly')
    combobox.current(0)
    combobox.grid(row=row, column=2)
def updatelist(已更新的行数):
...
...
新列表=[{'a':1},{'b':2},{'c':3}]
options=tk.StringVar(根)
选项=[x代表新列表中的x]
变量.set(选项[0])
combobox=tk.ttk.combobox(根,值=options,状态='readonly')
combobox.current(0)
combobox.grid(行=行,列=2)
options=tk.StringVar(根)
对于行,枚举中的数据(所有_数据):
entry=tk.Text(根,高度=1.5,宽度=15)
bind(“”,lambda事件,entry=entry,row=row:updateList(updated_Num=entry.get('1.0','end-1c'),row=row))
entry.grid(行=行,列=1)
选项=[x代表数据[2]中的x]
变量.set(选项[0])
combobox=tk.ttk.combobox(根,值=options,状态='readonly')
combobox.current(0)
combobox.grid(行=行,列=2)

问题在于在
for
-循环中创建
lambda
函数的方式。它正在为
entry
的值创建一个闭包,该值在循环的末尾是创建的最后一个输入框。解决此问题的常用方法是为lambda提供一个默认参数:

for row, data in enumerate(all_data):
    entry = tk.Text(root, height=1.5, width=15)
    entry.bind('<Return>', 
               lambda event, entry=entry: updateList(updated_Num=entry.get('1.0', 'end-1c')))
    entry.grid(row=row, column=1)
对于行,枚举中的数据(所有_数据):
entry=tk.Text(根,高度=1.5,宽度=15)
条目。绑定(“”,
lambda事件,entry=entry:updateList(updated_Num=entry.get('1.0','end-1c'))
entry.grid(行=行,列=1)

这是人们在循环中创建
tkinter
小部件时遇到的一个相当常见的问题,因此您的问题可能会以重复的形式结束。

谢谢,这有助于为我的函数获取正确的信息,但我仍然不知道如何使用返回的新列表更新我的组合框。还有,idk why每次按enter键都会清除我键入的答案。我总是可以返回并插入它,因为我在.get中得到了它,但最好不必添加它。@BrianC您可以使用
combobox.config(values=new\u list)
来更新组合框。对于另一部分,我不确定,您是否删除了函数中的值?@BrianC:您的问题中没有足够的信息告诉您如何解决这些其他问题。一个问题可能是
new\u list
updatelist()
函数中的局部变量。请提供一个runnable。我可以将选项、变量和组合框行复制/粘贴到函数的末尾,还可以将行传递到函数中,现在它可以工作了。谢谢你告诉我如何将信息传递到函数中@很高兴听到你这么说……不客气。仅供参考,如果您只需要知道事件处理程序中导致事件发生的小部件,您可以从
event.widget
中获得它,这样就不需要像我的回答中所示单独传递它。另一个用户提到了这一点,但后来删除了他们的答案(因此您可能无法看到)。