Python Tkinter 文本框监听器

5 投票
2 回答
5627 浏览
提问于 2025-04-16 07:21

我想知道怎么做(如果可能的话),让程序监听一个文本框里输入的特定短语或单词,然后执行一个命令。

比如说,如果我输入短语“把我变成红色”,我想知道有没有办法在不按回车的情况下就把它变成红色。

我刚开始学习,这里是我目前的代码:

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 个回答

1

你想要的事情当然是可以做到的。不过,解决方案要看你具体想要什么。

你是想让某个东西变成红色,只有当用户准确输入“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>,然后在回调函数中做决定,或者为一个确切的短语设置一个非常具体的绑定。

4

我觉得不如直接给你一个新的代码示例,这样看起来会更清晰,而不是去修改你的代码。

下面的代码做了什么呢?当你运行它时,会出现一个小工具,上面有一个空的文本框(在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()

撰写回答