gpt4 book ai didi

python-3.x - Tkinter:当按 'Enter' 时,它会转到下一个文本框

转载 作者:行者123 更新时间:2023-12-03 17:38:44 31 4
gpt4 key购买 nike

所以我的老师告诉我要学习 Tkinter 做我自己,我试着去理解它。
这是我正在查看的程序。

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

完成插入姓名后,我只想按 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()

最佳答案

一个快速而肮脏的方法是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 的 child 你从 master.winfo_children() 得到它们,它按照在代码中声明的顺序给出 child 。但是要小心,因为你得到了所有的 child ( Labels ,也是),所以你必须过滤 child (在这种情况下,过滤器是“按类型”,它是用 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)循环遍历条目(如果在最后一个条目按 Return 键,则转到第一个条目)。
  • 最后,将 switch 函数绑定(bind)到每个条目:
    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 ) . 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()

    关于python-3.x - Tkinter:当按 'Enter' 时,它会转到下一个文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44638007/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com