【问题标题】:Python Tkinter listener in text box文本框中的 Python Tkinter 侦听器
【发布时间】:2010-11-19 22:50:41
【问题描述】:

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

例如,如果我输入短语“把我变成红色”,我想知道是否可以在不按 Enter 的情况下将其变成红色。

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

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()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

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

    下面的代码是这样做的:当你运行它时,你会得到一个带有空文本框的小部件(技术上,Tkinter 中的 Label)供用户提供一些值。当他们输入数值(整数或浮点数)然后单击计算按钮时,以米为单位的等效值会出现在下方。 但是,如果用户键入“红色”,那么一旦输入“蓝色”这个词就会出现——即,即使 也会出现 蓝色计算按钮也没有点击其他任何东西。

    正如您在下面倒数第二行中看到的,获得您想要的行为只是在 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()
    

    【讨论】:

    • 我在windows上,它说找不到ttk。这是否与python一起提供。我用谷歌搜索了它,但只找到了 Linux 的东西?使用 Python V 2.6
    • 然后去掉它——即,替换所有出现的“ttk”。 with '' (并且显然删除了导入 ttk 的行)。
    【解决方案2】:

    你想要的当然是可能的。解决方案取决于您真正想要什么。

    您是否只想在用户准确键入“让我变红”时才将某些东西变红?或者,如果文本是“把我变成蓝色”并且他们将“蓝色”这个词更改为“红色”,这会触发动作吗?

    如果前者(必须准确输入“让我变红”),您可以绑定到该确切序列(例如:widget.bind("&lt;t&gt;&lt;u&gt;&lt;r&gt;&lt;n&gt;&lt;space&gt;&lt;m&gt;&lt;e&gt;....", doSomething))。然而,如果你也想让“Turn ME Red”做同样的事情,这将变得无法管理。

    如果是后者(每当您键入任何内容时,它都会查看“将其变为红色”是否围绕插入点),则需要做更多的工作。您可以绑定&lt;KeyRelease&gt;,然后查看魔术短语插入点之前的字符。

    底线是,您可以在 &lt;KeyRelease&gt; 之类的通用对象上设置绑定,然后在回调中做出决定,或者为确切的短语设置高度特定的绑定。

    【讨论】:

    • 你将如何处理 是否有一个可以链接到的示例,因为你可以告诉我相当新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2013-10-21
    • 2012-06-11
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多