【问题标题】:How to restrict Text widget input to certain characters with Tkinter?如何使用 Tkinter 将文本小部件输入限制为某些字符?
【发布时间】:2021-06-10 18:21:31
【问题描述】:

我的程序中有一个文本小部件 (my_text),它应该只接受某些字符。如果用户输入了字典中未定义的字符 (ACCEPTED),程序要么完全忽略输入,要么至少在输入后立即删除该字符。否则程序应该将对应的值输出到my_text2

我正在尽我最大的努力确保我的程序考虑到在文本内容结束之前输入的文本。例如,假设用户返回并在句子中间插入文本;该程序仍应按预期运行。这是我正在使用的逻辑的一个示例:

import tkinter as tk


# For this example, I'm converting the output from
# a QWERTY keyboard to the output of a Dvorak keyboard.
ACCEPTED = {
    "q": "'",
    "w": ",",
    "e": ".",
    "r": "p",
    "t": "y",
    "y": "f",
    # ...
}


def handle_input(s):
    my_text2.configure(state = tk.NORMAL)

    if s.char in set(ACCEPTED):
        my_text2.insert(
            my_text.index(tk.INSERT),
            ACCEPTED[s.char]
        )

    elif s.keysym.lower() in {"backspace", "delete"}:
        my_text2.delete(
            my_text.index(tk.INSERT)
            + "-1c" * (s.keysym.lower() == "backspace")
        )

    # This is the part I'm missing.
    else:
        pass

    my_text2.configure(state = tk.DISABLED)


root = tk.Tk()
root.geometry("648x163+10+10")

my_text = tk.Text(
    root,
    width = 40,
    height = 10,
)
my_text.bind("<Key>", handle_input)

my_text2 = tk.Text(
    root,
    width = 40,
    height = 10,
    state = tk.DISABLED,
)

my_text.grid(column = 0, row = 0)
my_text2.grid(column = 1, row = 0)

root.mainloop()

这两个文本小部件必须保持同步,我的程序才能正常运行。

到目前为止,我已经尝试过my_text.delete(tk.INSERT)my_text.delete(tk.CURRENT)"-1c" 的变体。我对 Tkinter 还是很陌生,所以我不确定发生了什么。在我看来,直到 handle_input() 运行之后,文本才真正输入到 my_text,这意味着不会有任何内容要删除。当我输入未在ACCEPTED 中定义的字符时,它仍会显示在my_text 中,这会使两个文本小部件不同步。

在我发现类似问题的任何地方,手头的问题都不能解释tk.END 之前的文本,但我正在尝试完美匹配这两个文本小部件,所以tk.END 将无法正常工作对我来说。

【问题讨论】:

  • 如果您想阻止tkinter 处理密钥,请使用:return "break"。这将告诉 tkinter 忽略该事件。
  • @TheLizzard 如果您将此作为答案提交,我会接受。这解决了我的问题;谢谢!
  • 好的,我会写一个答案

标签: python tkinter


【解决方案1】:

从事件调用的函数返回"break",将停止事件。这意味着tkinter 的小部件永远不会收到该事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多