如何在tkinter中停止文本小部件中的复制、粘贴和退格?

2024-09-30 18:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在使用tkinter开发文本小部件。我的要求是限制复制(ctrl+c)、粘贴(ctrl+v)和退格的功能。这就像一旦进入文本小部件,就没有像清除和从某处添加这样的编辑。用户必须键入,不能退格

self.inputfeild = tk.Text(self, bg="White")
self.inputfeild.pack(fill="both", expand=True)

这是我在类中声明的文本小部件


Tags: text用户文本self功能编辑键入粘贴
2条回答

除了@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()

这基本上会在每次执行KeyPressKeyRelease时清除剪贴板,因此无法进行复制/粘贴函数backspace()获取最后一个字符,并将其重新插入使用backspace的最后一个位置,间接限制其功能。我以前对backspace()的建议不正确,因为它没有考虑选择,但现在它应该在所有情况下都能工作,如果选择了某个字符,它将获取所选文本并将其插入到所选内容的开头(SEL_FIRST),否则它将仅获取并重新插入最后一个字符

您可以使用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()

相关问题 更多 >