【问题标题】:How to stop copy, paste, and backspace in text widget in tkinter?如何在 tkinter 的文本小部件中停止复制、粘贴和退格?
【发布时间】:2020-12-26 12:45:21
【问题描述】:

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

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

这是我在类中声明的 Text 小部件。

【问题讨论】:

  • 这是help吗?
  • 我读到了。但是我的要求不一样。谢谢你。 :)

标签: python tkinter text


【解决方案1】:

您可以使用event_delete 方法删除与之关联的虚拟事件。

例如:

inputfield.event_delete('<<Paste>>', '<Control-v>')
inputfield.event_delete('<<Copy>>', '<Control-c>')

查看更多Here

或者您可以简单地将事件绑定到事件处理程序并像这样返回“中断”:

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()

【讨论】:

  • 这正是我想要的,非常感谢!
【解决方案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() 的访问是不正确的,因为它没有t 考虑选择,但现在它应该适用于所有情况,如果选择了某些内容,它将获取选定的文本并将其插入到选择的开头(SEL_FIRST)否则它只会获取并重新插入最后一个字符。

【讨论】:

    猜你喜欢
    • 2023-01-14
    • 2011-10-20
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多