Tot*_*tem 4 python user-interface tkinter widget
我在一个简单的计算器上有一个Entry小部件.用户可以选择通过键盘输入等式.我想知道是否有一种方法可以检测到一个字符(在我的情况下来自键盘)被输入到Entry小部件中.因此,重点放在小部件上,用户按下'4',它出现在小部件上...我可以检测到这个动作,用于记录输入的基本目的吗?
是.事实上,有几种不同的方法可以做到这一点.
您可以创建一个StringVar,将其附加到Entry,以及trace它的更改; 你可以bind参加所有相关的活动; 或者您可以添加一个验证命令,该命令在序列中的几个不同点中的任何一个点上触发.他们都做了稍微不同的事情.
当用户输入时4,会出现一个只有其中的键事件4(不能让您区分用户是在添加4到结尾,还是在中间,或者替换整个选定的单词,或者......),然后是使用旧文本*触发修改事件,然后使用(建议的)新文本调用"key"或"all"验证函数,并使用(接受的)新文本更新变量(除非返回验证函数) false,在这种情况下会invalidcommand被调用.
我不知道你想要哪一个,所以让我们展示所有这些,你可以玩它们并选择你想要的那个.
import Tkinter as tk
root = tk.Tk()
def validate(newtext):
print('validate: {}'.format(newtext))
return True
vcmd = root.register(validate)
def key(event):
print('key: {}'.format(event.char))
def var(*args):
print('var: {} (args {})'.format(svar.get(), args))
svar = tk.StringVar()
svar.trace('w', var)
entry = tk.Entry(root,
textvariable=svar,
validate="key", validatecommand=(vcmd, '%P'))
entry.bind('<Key>', key)
entry.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
变量跟踪回调的语法有点复杂,而且在Tkinter中没有详细记录; 如果你想知道前两个参数的意思,你需要阅读Tcl/Tk文档,并了解Tkinter如何将你的特定映射StringVar到Tcl名称'PY_VAR0'......实际上,为每个变量构建一个单独的函数要容易得多您要跟踪的模式,并忽略args.
验证函数的语法更加复杂,并且比我所展示的更灵活.例如,您可以获取插入的文本(在粘贴操作的情况下可以是多个字符),它的位置以及各种其他内容......但这些都不会在Tkinter文档中的任何位置进行描述,因此您将需要去Tcl/Tk文档.你想要的最常见的事情是建议的新文本作为参数,为此,使用(vcmd, '%P').
无论如何,你一定要玩各种不同的东西,看看每种机制给你的东西.在键入之前移动光标或选择部分字符串,使用键盘和鼠标粘贴,拖放选择,点击各种特殊键等.
*我将忽略这一步,因为它在不同版本的Tk中有所不同,并且无论如何都不是很有用.在您确实需要修改事件的情况下,最好使用Text窗口小部件并绑定<<Modified>>.
每次在Tkinter窗口中按一个键时,Tkinter.Event都会创建一个实例.您需要做的就是访问该实例.这是一个简单的脚本,演示如何:
from Tkinter import Tk, Entry
root = Tk()
def click(key):
# print the key that was pressed
print key.char
entry = Entry()
entry.grid()
# Bind entry to any keypress
entry.bind("<Key>", click)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
key(作为Tkinter.Event实例)包含许多不同的属性,可用于在按下的键上获取所需的几乎任何类型的数据.我选择在.char这里使用属性,该脚本将打印每个按键的内容.