一个快速和肮脏的方法是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
的子女,你可以从master.winfo_children()
得到他们,这样可以让孩子按照他们在代码中声明的顺序排列。要小心,虽然,因为你得到所有孩子(的Labels
,太),所以你要过滤的孩子(在这种情况下,过滤器是“按类型”,它与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)
周期在条目(如果按返回最后一项,你去第一一)。
最后,开关功能绑定到每个条目:
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
用于创建另一个函数(非常类似于def
),它具有2个参数而不是go_to_next_entry
所需的3个参数。该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()
你问如何使9行代码更简单?这将是艰难的! –