Python Tkinter 文本框监听器
我想知道怎么做(如果可能的话),让程序监听一个文本框里输入的特定短语或单词,然后执行一个命令。
比如说,如果我输入短语“把我变成红色”,我想知道有没有办法在不按回车的情况下就把它变成红色。
我刚开始学习,这里是我目前的代码:
from Tkinter import *
class mywidgets:
def __init__(self,root):
frame=Frame(root)
frame.pack()
self.txtfr(frame)
return
def txtfr(self,frame):
#define a new frame and put a text area in it
textfr=Frame(frame)
self.text=Text(textfr,height=10,width=50,background='white')
# put a scroll bar in the frame
scroll=Scrollbar(textfr)
self.text.configure(yscrollcommand=scroll.set)
#pack everything
self.text.pack(side=LEFT)
scroll.pack(side=RIGHT,fill=Y)
textfr.pack(side=TOP)
return
def main():
root = Tk()
s=mywidgets(root)
root.title('textarea')
root.mainloop()
main()
2 个回答
你想要的事情当然是可以做到的。不过,解决方案要看你具体想要什么。
你是想让某个东西变成红色,只有当用户准确输入“turn me red”时才会变吗?还是说,如果用户输入的是“turn me blue”,然后把“blue”改成“red”,也能触发这个动作呢?
如果是前者(必须准确输入“turn me red”),你可以直接绑定这个确切的输入(比如:widget.bind("<t><u><r><n><space><m><e>....", doSomething)
)。但是,如果你还想让“Turn ME Red”也能做到同样的事情,那就会变得很麻烦。
如果是后者(只要输入任何东西,系统就会检查“turn it red”是否在光标周围),那就稍微复杂一点。你可以在<KeyRelease>
事件上绑定,然后查看光标前面的字符,看看有没有那个神奇的短语。
总之,你可以选择在一些通用的事件上设置绑定,比如<KeyRelease>
,然后在回调函数中做决定,或者为一个确切的短语设置一个非常具体的绑定。
我觉得不如直接给你一个新的代码示例,这样看起来会更清晰,而不是去修改你的代码。
下面的代码做了什么呢?当你运行它时,会出现一个小工具,上面有一个空的文本框(在Tkinter中,实际上是一个标签),用户可以在这里输入一些值。当他们输入一个数字(可以是整数或小数),然后点击计算按钮时,下面就会显示出相应的米数。不过,如果用户输入的是“red”,那么一输入这个词就会立刻显示“blue”,也就是说,即使没有点击计算按钮,blue这个词也会出现。
正如你在倒数第二行看到的,想要实现你想要的效果,只需要在Tkinter事件语法中描述你想要的行为就可以了。
from Tkinter import *
import ttk
root = Tk()
def calculate(*args) :
value = float(feet.get())
meters.set((0.305 * value * 10000. + .5)/10000.)
def callback_function(*args) :
meters.set('blue')
mf = ttk.Frame(root, padding="3 3 12 12")
mf.grid(column=0, row=0, sticky=(N, W, E, S))
mf.columnconfigure(0, weight=1)
mf.rowconfigure(0, weight=1)
feet = StringVar()
meters = StringVar()
feet_entry = ttk.Entry(mf, width=7, textvariable=feet)
feet_entry.grid(column=2, row=1, sticky=(W, E))
ttk.Label(mf, textvariable=meters, background='#E9D66B').grid(column=2,
row=2, sticky=(W, E))
ttk.Button(mf, text="Calculate", command=calculate).grid(column=2,row=3,
sticky=W)
ttk.Label(mf, text="feet").grid(column=3, row=1, sticky=W)
ttk.Label(mf, text="is equivalent to").grid(column=1, row=2, sticky=E)
ttk.Label(mf, text="meters").grid(column=3, row=2, sticky=W)
for child in mf.winfo_children():
child.grid_configure(padx=5, pady=5)
feet_entry.focus()
root.bind('<Return>', calculate)
# this is the key line
root.bind('red', callback_function)
root.mainloop()