Skip to main content
 首页 » 编程设计

python-3.x之Tkinter:当按 'Enter' 时,它会转到下一个文本框

2025年12月25日34飞鱼

所以我的老师告诉我要学习 Tkinter 做我自己,我试着去理解它。
这是我正在查看的程序。

它要求输入姓名和姓氏。 (是的,西类牙语是我的母语)

完成插入姓名后,我只想按 Enter 键转到下一个文本框,即姓氏。

from tkinter import * 
 
master = Tk() 
Label(master, text="Ingrese sus nombres: ").grid(row=0) 
Label(master, text="Ingrese sus apellidos: ").grid(row=1) 
 
e1 = Entry(master) 
e2 = Entry(master) 
 
e1.grid(row=0, column=1) 
e2.grid(row=1, column=1) 
 
mainloop() 

请您参考如下方法:

一个快速而肮脏的方法是bind第一个Entry小部件到将焦点切换到另一个小部件的功能:

def go_to_next_entry(event): 
    e2.focus_set() # focus_set() switches the focus to the new widget 
 
e1.bind('<Return>', go_to_next_entry) 
# or, if you are familiar with lambdas, simply: 
# e1.bind('<Return>', lambda e: e2.focus_set()) 

.bind 方法的第一个参数是表示用户交互类型的字符串,第二个参数是单个参数(事件参数)的函数。在这种情况下,您不必关心它,但如果您正在监视光标的移动,事件可以给你它的坐标。)

对于更一般的方式,事情变得更加棘手,这种方法似乎比任何东西都更像是一种黑客行为。无论如何,如果您有很多条目,您可以像这样自动化该方法:
  • 查找所有 Entry小部件。他们是 master 的 child 你从 master.winfo_children() 得到它们,它按照在代码中声明的顺序给出 child 。但是要小心,因为你得到了所有的 child ( Labels ,也是),所以你必须过滤 child (在这种情况下,过滤器是“按类型”,它是用 isinstance 完成的):
    entries = [child for child in master.winfo_children() 
               if isinstance(child, Entry)] 
    
  • 然后,您定义将焦点切换到所需小部件的函数:
    def go_to_next_entry(event, entry_list, this_index): 
        next_index = (this_index + 1) % len(entry_list) 
        entry_list[next_index].focus_set() 
    

    部分next_index = (this_index + 1) % len(entries)循环遍历条目(如果在最后一个条目按 Return 键,则转到第一个条目)。
  • 最后,将 switch 函数绑定(bind)到每个条目:
    for idx, entry in enumerate(entries): 
        entry.bind('<Return>', lambda e, idx=idx: go_to_next_entry(e, entries, idx)) 
    

    可怕的是:lambda e, idx=idx: go_to_next_entry(e, entries, idx) .这里的重要部分是 lambda用于创建另一个具有 2 个参数而不是 def 所需的 3 个参数的函数(很像 go_to_next_entry ) . idx=idx部分使得可以只用 1 个参数调用新创建的函数(根据 .bind 的要求。)看看为什么 idx=idx其实很重要,不能省略,看看Generate Tkinter buttons dynamically (关于按钮,但原理是一样的。)

  • 完整代码:
    from tkinter import * 
     
    master = Tk() 
    Label(master, text="Ingrese sus nombres: ").grid(row=0) 
    Label(master, text="Ingrese sus apellidos: ").grid(row=1) 
     
    e1 = Entry(master) 
    e2 = Entry(master) 
    e3 = Entry(master) 
    e4 = Entry(master) 
     
    e1.grid(row=0, column=1) 
    e2.grid(row=1, column=1) 
    e3.grid(row=2, column=1) 
    e4.grid(row=3, column=1) 
     
    def go_to_next_entry(event, entry_list, this_index): 
        next_index = (this_index + 1) % len(entry_list) 
        entry_list[next_index].focus_set() 
     
    entries = [child for child in master.winfo_children() if isinstance(child, Entry)] 
    for idx, entry in enumerate(entries): 
        entry.bind('<Return>', lambda e, idx=idx: go_to_next_entry(e, entries, idx)) 
     
    mainloop()