Tkinter:按"Enter"键,然后进入下一个文本框

Mig*_*lca 3 tkinter python-3.x

所以我的老师告诉我要学习Tkinter,我会尝试去理解它.这是我正在看的程序.

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

当我完成插入名称后,我只想按回车键转到下一个姓氏的文本框.

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()
Run Code Online (Sandbox Code Playgroud)

Pie*_*olo 6

一个快速而肮脏的方法是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())
Run Code Online (Sandbox Code Playgroud)

.bind方法需要作为第一个参数代表用户交互的类型的字符串,并作为第二个参数,一个功能单一的参数(事件参数的.在这种情况下,你不必在意这一点,但如果你是监控光标的移动,事件可以给你它的坐标.)


对于更通用的方式,事情变得更棘手,这种方法似乎比任何东西都更糟糕.无论如何,如果你有很多条目,你可以像这样自动化方法:

  1. 找到所有Entry小部件.他们是master你的孩子,你从中得到它们master.winfo_children(),它们按照代码中声明的顺序给孩子们.但是要小心,因为你得到了所有的孩子(Labels也是),所以你必须过滤孩子(在这种情况下,过滤器是"按类型"并且完成了isinstance):

    entries = [child for child in master.winfo_children()
               if isinstance(child, Entry)]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,您定义将焦点切换到所需小部件的功能:

    def go_to_next_entry(event, entry_list, this_index):
        next_index = (this_index + 1) % len(entry_list)
        entry_list[next_index].focus_set()
    
    Run Code Online (Sandbox Code Playgroud)

    该部分next_index = (this_index + 1) % len(entries)在条目上循环(如果您按Return最后一个条目,则转到第一个条目).

  3. 最后,将switch函数绑定到每个条目:

    for idx, entry in enumerate(entries):
        entry.bind('<Return>', lambda e, idx=idx: go_to_next_entry(e, entries, idx))
    
    Run Code Online (Sandbox Code Playgroud)

    可怕的部分是:lambda e, idx=idx: go_to_next_entry(e, entries, idx).这里的重要部分lambda是用于创建另一个函数(很像def),它有2个参数而不是3个参数go_to_next_entry.该idx=idx部分可以用一个参数调用新创建的函数(根据需要.bind).要查看为什么idx=idx实际上很重要且无法省略,请查看动态生成Tkinter按钮(这是关于按钮,但是原理是一样的.)

完整的代码:

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()
Run Code Online (Sandbox Code Playgroud)