一個快速和骯髒的方法是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行代碼更簡單?這將是艱難的! –