【问题标题】:Validation on Tkinter.Text widget?验证 Tkinter.Text 小部件?
【发布时间】:2013-06-11 19:23:16
【问题描述】:

我有哪些使用Tkinter.Text 小部件进行验证的选项?我不需要Text 的高级功能,只需要它的多行属性。不幸的是,它缺少textvariablevalidate 命令,所以我似乎无法附加某种回调来检查每次文本更改时的内容。我想避免绑定到<KeyRelease>,因为它看起来会捕获所有按键,包括 Shift、Ctrl 等键,并且看起来有点乱。

我基本上只需要检查文本字段是否为空白,并根据需要启用/禁用“确定”按钮(即,如果没有文本,则该按钮被禁用)。

取而代之的是,有没有人遇到过一个像样的 Entry 子类,它添加了用 Python 编写的多行功能?有this,在Text上加了textvariable,不过是纯TCL写的,不是Python写的,好像很难集成到我现有的Python环境中。

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    <KeyRelease> 按钮的绑定不必乱七八糟,您不必检查按下的键的值,而是获取小部件的内容。请记住,它最后总是有一个'\n',所以当你检索内容时不要忘记丢弃它:

    content = text.get(1.0, "end-1c")
    

    那么你只需要根据这个值改变按钮的状态:

    import Tkinter as tk
    
    def configure_ok_button(event):
        content = event.widget.get(1.0, "end-1c")
        state = "active" if content else "disabled"
        button.configure(state=state)
    
    root = tk.Tk()
    text = tk.Text(root)
    button = tk.Button(root, text="Ok", state="disabled")
    text.bind("<KeyRelease>", configure_ok_button)
    text.pack()
    button.pack()
    root.mainloop()
    

    【讨论】:

    • 那么对于这个任务来说,检查和丢弃修饰键(如 Shift/Alt/Ctrl 等)真的没有意义吗?我不确定在 Tkinter 中错误的按键可能会有怎样的表现。我更习惯于 .NET 中的键盘处理事件,所以仍然习惯于 Tkinter 的方法。
    • @Kumba 没有修改 &lt;KeyRelease&gt; 事件以丢弃某些值(或者至少没有记录)。您可以在回调函数中检查 event.keysym in ('Shift_L', 'Control_L', 'Alt_L') 是否存在,但我认为这样做没有任何意义。由于您只是检查内容的长度,因此这些键不会对该任务造成问题。
    • 这成功了!但是,如果按住重复键,则在释放按钮之前不会生成&lt;KeyRelease&gt; 事件。我想在这种情况下我可以联系&lt;KeyPress&gt;
    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2011-04-01
    相关资源
    最近更新 更多