【发布时间】:2021-06-30 15:55:52
【问题描述】:
我有一个ttk.Combobox,我的用户可以从选项下拉列表中进行选择,或者手动输入一些内容。我将它绑定到Return,这样如果我的用户在进行更改后按下回车键,它将更新,但是如果我的用户在框中单击并意外输入了其他内容,则会导致错误。需要明确的是,我已经有一个绑定到新选择的事件,以及按下回车键。
我在问是否可以在焦点离开框时检查框值是否已更改,如果是,则调用函数?当我尝试FocusOut 绑定时,每次单击其中一个下拉列表时,它都会调用我的函数,并且不允许我从下拉列表中选择任何内容,因此这是行不通的。
selection.bind('<Return>', lambda event, entry=selection, row=row: update(
updated_entry=entry.get(), row=row, entry=entry))
selection.bind('<<ComboboxSelected>>', lambda event, entry=selection, row=row: update(
updated_entry=entry.get(), row=row, entry=entry))
编辑:这是一个示例代码。这是写的,如果用户从下拉列表中选择一个项目,它会更新标签。如果用户输入内容并按下 Return 键,它会更新标签。但是,如果用户输入内容并单击另一个下拉菜单,则不会更新标签。
import tkinter as tk
from tkinter import ttk
def update(updated_entry, row, entry):
label = tk.Text(root, height=1, width=10)
label.insert(tk.END, updated_entry)
label.grid(row=row, column=2)
return 'break'
def gui(root):
root.geometry('300x150')
root.config(background='snow3')
for row in range(2):
options = ['test', 'test1', 'test2']
selection = tk.ttk.Combobox(root, value=options)
selection.bind('<Return>', lambda event, entry=selection, row=row: update(
updated_entry=entry.get(), row=row, entry=entry))
selection.bind('<<ComboboxSelected>>', lambda event, entry=selection, row=row: update(
updated_entry=entry.get(), row=row, entry=entry))
selection.grid(row=row, column=1)
label = tk.Text(root, height=1, width=10)
label.grid(row=row, column=2)
if __name__ == '__main__':
root = tk.Tk()
gui(root)
tk.mainloop()
【问题讨论】:
-
@martineau 我添加了一个最小的可重现示例。
-
我不清楚你想要完成什么。您在
gui()中的for循环中创建Labels,然后update()函数创建一个Text小部件,并放置在其中一个或另一个之上。 -
标签没有任何意义,我只是写了这个。在我的真实代码中,我正在调用一个函数来更新完全不同的东西,但这是我最小的可重现示例。我想要的是我的更新函数被称为 IF 文本已在下拉列表之一中更改。例如,如果您运行上述代码并在第一个组合框中键入 Hello 并按 Enter,它将运行更新功能并添加文本。但是,如果您在组合框中键入 hello 然后单击另一个组合框,它不会运行更新功能。如果输入了文本,我需要运行更新功能。
-
将相同的 lambda 绑定到
<FocusOut>事件后可以正常工作。