文本框中的Python Tkinter监听器

时间:2010-11-19 22:50:42

标签: python tkinter

我想知道如何(如果可能)收听在文本框中输入的某个短语或单词并运行命令。

例如,如果我输入短语“turn me red”,我想知道是否可以在不按回车的情况下将其变为红色。

我刚刚开始,这就是我所拥有的:

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 个答案:

答案 0 :(得分:4)

所以我认为如果不是编辑你的代码会更清洁,我只是提供了一个新的工作代码示例,展示了你感兴趣的行为。

以下代码的作用如下:当您运行它时,您将获得一个带有空文本框的小部件(技术上,Tkinter中的 Label ),以便用户提供一些值。当他们输入数值(整数或浮点数)然后单击计算按钮时,下方会出现等效的米数值。 但是,如果用户键入“红色”,则输入后会立即显示“蓝色”字样 - 即使 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()

答案 1 :(得分:1)

你想要的肯定是可能的。解决方案取决于您真正想要的。

只有当用户准确地输入“让我变红”时,你才想把东西变成红色吗?或者,如果文本是“让我变成蓝色”而他们将“蓝色”改为“红色”,那么会触发动作吗?

如果前者(必须完全“打开红色”),你可以绑定到那个确切的序列(例如:widget.bind("<t><u><r><n><space><m><e>....", doSomething))。但是,如果你还想要“让我变成红色”来做同样的事情,那就无法管理了。

如果是后者(无论何时键入任何内容,它都会看到“将其变为红色”环绕插入点),这是一个更多的工作。您可以绑定<KeyRelease>,然后查看魔术短语插入点之前的字符。

一句话是,你在像<KeyRelease>这样的通用东西上建立一个绑定,然后在回调中做出决定,或者为一个精确的短语设置一个高度特异的绑定。