Tkinter:按“输入”键,然后进入下一个文本框

时间:2017-06-19 18:58:59

标签: python-3.x tkinter

所以我的老师告诉我要学习Tkinter,我会尝试去理解它。 这是我正在看的程序。

它要求输入姓名和姓氏。 (是的,西班牙语是我的母语)

当我完成插入名称后,我只想按回车键转到下一个姓氏的文本框。

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

2 个答案:

答案 0 :(得分:6)

快速而肮脏的方法是var btn1 = document.querySelectorAll("a[href^='#sign-up']"); 第一个bind小部件到一个将焦点切换到另一个小部件的函数:

Entry

.bind方法期望第一个参数是表示用户交互类型的字符串,第二个参数是单个参数的函数(事件参数。)如果您不必关心它,但如果您正在监视光标的移动,则事件可以为您提供坐标。)

对于更一般的方式,事情变得棘手,这种方法似乎比任何东西都更糟糕。无论如何,如果你有很多条目,你可以像这样自动化方法:

  1. 查找所有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()) 个小部件。他们是Entry的孩子,你从master得到它们,它们按照代码中声明的顺序给出了孩子。但要小心,因为你得到所有孩子(master.winfo_children()也是如此),所以你必须过滤孩子(在这种情况下,过滤器是&#34;按类型&# 34;用Labels)完成:

    isinstance
  2. 然后,您定义将焦点切换到所需小部件的功能:

    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() 在条目上循环(如果您在最后一个条目按返回,则转到第一个条目。)

  3. 最后,将switch函数绑定到每个条目:

    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),它有2个参数而不是def所需的3个参数。 go_to_next_entry部分可以使用1个参数调用新创建的函数(根据idx=idx的要求。)要查看为什么.bind实际上很重要且无法省略,请看一下Generate Tkinter buttons dynamically(关于按钮,但原理是一样的。)

  4. 完整的代码:

    idx=idx

答案 1 :(得分:0)

我找到了一个解决方案。

如果我们有两个条目,例如Entry_1和Entry_2,则我们希望光标首先停在Entry_1上,当我们按Enter键(或除“ Return”键之外的任何其他键)时,光标将传递到Entry_2。

entry_1.focus() 
entry_1.bind("<Return>",lambda funct1:entry_2.focus())