【问题标题】:Validate tkinter text widget验证 tkinter 文本小部件
【发布时间】:2020-10-05 12:36:36
【问题描述】:

我正在 Tkinter 中开发一个简单的文本编辑器。我想在用户输入文本时验证文本小部件,以便可以应用样式。我无法绑定到<KeyPress>,因为它会在按下键后更新,并且我无法绑定到<KeyRelease>,因为当用户按住某个键时它不会触发事件,这是它需要的。有没有其他方法可以解决这个问题?
这是最小的代码:

import tkinter as tk

class textEditor(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.textFrm = tk.Frame(self)
        self.textFrm.pack(fill = "x")
        self.text = tk.Text(self.textFrm, relief = "flat", font = ("Arial","11"))
        self.text.pack(fill = "both", expand = True)
        self.text.bind("<KeyRelease>",lambda event: self.keyPress())
        self.text.focus()
    def keyPress(self):
        #This is not called when a key is held down
        print(self.text.get("end-2c","end-1c"))

root = tk.Tk()
root.title("Text editor test")
t = textEditor(root)
t.pack()
root.mainloop()

【问题讨论】:

  • 这是否意味着您基本上需要这两种功能?即即使在按键之后也应该触发验证,并且在按住后按住或释放键时也应该触发验证?如果是的话,我相信这是很有可能的。
  • @PSSolanki 我希望它在按键时(而不是之后)和按下时。 Keyrelease 修复了第一个问题,但导致了第二个问题
  • 知道了。现在写一个答案:)

标签: python tkinter


【解决方案1】:

我可以通过简单地将&lt;KeyRelease&gt;&lt;KeyPress&gt; 绑定到tk.Text 小部件来解决问题。(虽然我按照指定的相同顺序执行了bindings,但我认为这不会有所作为)。

现在我不能说这是一个好的解决方案还是一个好的实践,但它确实起到了作用。

import tkinter as tk

class textEditor(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.textFrm = tk.Frame(self)
        self.textFrm.pack(fill = "x")
        self.text = tk.Text(self.textFrm, relief = "flat", font = ("Arial","11"))
        self.text.pack(fill = "both", expand = True)
        self.text.bind("<KeyRelease>",lambda event: self.keyPress())
        self.text.bind("<KeyPress>",lambda event: self.keyPress())
        self.text.focus()
        
    def keyPress(self):
        print(self.text.get("end-2c","end-1c"))

root = tk.Tk()
root.title("Text editor test")
t = textEditor(root)
t.pack()
root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多