Mig*_*lca 3 tkinter python-3.x
所以我的老师告诉我要学习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()
Run Code Online (Sandbox Code Playgroud)
一个快速而肮脏的方法是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())
Run Code Online (Sandbox Code Playgroud)
该.bind方法需要作为第一个参数代表用户交互的类型的字符串,并作为第二个参数,一个功能单一的参数(事件参数的.在这种情况下,你不必在意这一点,但如果你是监控光标的移动,事件可以给你它的坐标.)
对于更通用的方式,事情变得更棘手,这种方法似乎比任何东西都更糟糕.无论如何,如果你有很多条目,你可以像这样自动化方法:
找到所有Entry小部件.他们是master你的孩子,你从中得到它们master.winfo_children(),它们按照代码中声明的顺序给孩子们.但是要小心,因为你得到了所有的孩子(Labels也是),所以你必须过滤孩子(在这种情况下,过滤器是"按类型"并且完成了isinstance):
entries = [child for child in master.winfo_children()
if isinstance(child, Entry)]
Run Code Online (Sandbox Code Playgroud)然后,您定义将焦点切换到所需小部件的功能:
def go_to_next_entry(event, entry_list, this_index):
next_index = (this_index + 1) % len(entry_list)
entry_list[next_index].focus_set()
Run Code Online (Sandbox Code Playgroud)
该部分next_index = (this_index + 1) % len(entries)在条目上循环(如果您按Return最后一个条目,则转到第一个条目).
最后,将switch函数绑定到每个条目:
for idx, entry in enumerate(entries):
entry.bind('<Return>', lambda e, idx=idx: go_to_next_entry(e, entries, idx))
Run Code Online (Sandbox Code Playgroud)
可怕的部分是:lambda e, idx=idx: go_to_next_entry(e, entries, idx).这里的重要部分lambda是用于创建另一个函数(很像def),它有2个参数而不是3个参数go_to_next_entry.该idx=idx部分可以用一个参数调用新创建的函数(根据需要.bind).要查看为什么idx=idx实际上很重要且无法省略,请查看动态生成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)
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1350 次 |
| 最近记录: |