我想知道如何(如果可能)收听在文本框中输入的某个短语或单词并运行命令。
例如,如果我输入短语“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()
答案 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>
这样的通用东西上建立一个绑定,然后在回调中做出决定,或者为一个精确的短语设置一个高度特异的绑定。