2017-06-19 302 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非常感谢你 –

相关问题