所以我的老师告诉我要学习 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 键,则转到第一个条目)。 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()


