2017-06-19 363 views
3

所以我的老師告訴我要學習Tkinter做我自己,我試着理解它。 這是我正在看的程序。Tkinter:當按下'Enter'時,它會進入下一個文本框

它要求名稱和姓氏。 (是的,西班牙語是我的母語)

當我完成插入名稱時,我只想按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() 
+1

你問如何使9行代碼更簡單?這將是艱難的! –

回答

5

一個快速和骯髒的方法是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方法預計作爲第一個參數的字符串表示用戶交互的類型以及作爲第二個參數的單個參數(事件參數)的函數函數。在這種情況下,您不必關心該事件,但是如果您在監視光標的移動,則事件可以給你它的座標。)


對於更一般的方式,事情變得更加棘手,而且這種方法似乎比任何事情都更糟糕。無論如何,如果你有很多條目,你可以像這樣自動化的方法:

  1. 找到所有Entry部件。他們是master的子女,你可以從master.winfo_children()得到他們,這樣可以讓孩子按照他們在代碼中聲明的順序排列。要小心,雖然,因爲你得到所有孩子(的Labels,太),所以你要過濾的孩子(在這種情況下,過濾器是「按類型」,它與isinstance完成):

    entries = [child for child in master.winfo_children() 
          if isinstance(child, Entry)] 
    
  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() 
    

    的部分next_index = (this_index + 1) % len(entries)週期在條目(如果按返回最後一項,你去第一一)。

  3. 最後,開關功能綁定到每個條目:

    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() 
+0

謝謝。如何在其他行中使用它?更通用的功能,而不僅僅是將其應用於e2。 –

+1

lul非常感謝你 –

相關問題