2024-09-30 18:29:14 发布
网友
我一直在使用tkinter开发文本小部件。我的要求是限制复制(ctrl+c)、粘贴(ctrl+v)和退格的功能。这就像一旦进入文本小部件,就没有像清除和从某处添加这样的编辑。用户必须键入,不能退格
self.inputfeild = tk.Text(self, bg="White") self.inputfeild.pack(fill="both", expand=True)
这是我在类中声明的文本小部件
除了@JacksonPro的答案之外,您还可以尝试这种方法
from tkinter import * def backspace(event): if text.tag_ranges(SEL): text.insert(SEL_FIRST,text.get(SEL_FIRST, SEL_LAST)) else: last_char=text.get('1.0','end-1c')[-1] text.insert(END,last_char) root=Tk() text=Text(root) text.pack() text.bind('<KeyRelease>', lambda event=None:root.clipboard_clear()) text.bind('<KeyPress>', lambda event=None:root.clipboard_clear()) text.bind('<BackSpace>', backspace) root.mainloop()
这基本上会在每次执行KeyPress或KeyRelease时清除剪贴板,因此无法进行复制/粘贴函数backspace()获取最后一个字符,并将其重新插入使用backspace的最后一个位置,间接限制其功能。我以前对backspace()的建议不正确,因为它没有考虑选择,但现在它应该在所有情况下都能工作,如果选择了某个字符,它将获取所选文本并将其插入到所选内容的开头(SEL_FIRST),否则它将仅获取并重新插入最后一个字符
KeyPress
KeyRelease
backspace()
SEL_FIRST
您可以使用event_delete方法删除与其关联的虚拟事件
event_delete
例如:
inputfield.event_delete('<<Paste>>', '<Control-v>') inputfield.event_delete('<<Copy>>', '<Control-c>')
查看更多Here
或者,您可以简单地将该事件绑定到事件处理程序,并像下面这样返回“break”:
from tkinter import * root = Tk() inputfield = Text(root, bg="White") inputfield.pack(fill="both", expand=True) inputfield.bind('<Control-v>', lambda _: 'break') inputfield.bind('<Control-c>', lambda _: 'break') inputfield.bind('<BackSpace>', lambda _: 'break') root.mainloop()
除了@JacksonPro的答案之外,您还可以尝试这种方法
这基本上会在每次执行
KeyPress
或KeyRelease
时清除剪贴板,因此无法进行复制/粘贴函数我以前对backspace()
获取最后一个字符,并将其重新插入使用backspace的最后一个位置,间接限制其功能。backspace()
的建议不正确,因为它没有考虑选择,但现在它应该在所有情况下都能工作,如果选择了某个字符,它将获取所选文本并将其插入到所选内容的开头(SEL_FIRST
),否则它将仅获取并重新插入最后一个字符您可以使用
event_delete
方法删除与其关联的虚拟事件例如:
查看更多Here
或者,您可以简单地将该事件绑定到事件处理程序,并像下面这样返回“break”:
相关问题 更多 >
编程相关推荐