【发布时间】: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 如果您将此作为答案提交,我会接受。这解决了我的问题;谢谢!
-
好的,我会写一个答案