禁用Tkinter条目中的复制/粘贴操作

时间:2014-02-21 12:19:30

标签: python tkinter

如何在tkinter输入字段上禁用复制和粘贴。我尝试使用:

self.ent_city = Tkinter.Entry(bd='4',width='32', state='readonly')

但是这个命令几乎与state = 'disabled'相似。我想在我的条目小部件上禁用复制/粘贴或剪切/粘贴。

任何帮助将不胜感激。 提前致谢

2 个答案:

答案 0 :(得分:4)

您可以将按键和右键单击绑定在一起,如下所示:

from Tkinter import *

class App(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.pack()
        self.ent = Entry(self, width=15)
        self.ent.pack()

        self.ent.bind('<Control-x>', lambda e: 'break') #disable cut
        self.ent.bind('<Control-c>', lambda e: 'break') #disable copy
        self.ent.bind('<Control-v>', lambda e: 'break') #disable paste
        self.ent.bind('<Button-3>', lambda e: 'break')  #disable right-click

root = Tk()
app = App()
mainloop()

这不是万无一失的,但我认为这是一个不错的解决方案。查看http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm了解详情。

答案 1 :(得分:0)

我认为没有正式的方法可以在tkinter中禁用剪切/复制/粘贴(非常烦人),并且在XWayland上调用self.ent.bind('<Control-v>', lambda e:'break')似乎不起作用(tkinter在Xorg上的x11中运行,或者Wayland上的XWayland) 我已经尝试过self.ent.unbind('<<paste>>'),但这也没有帮助。

一个可行的办法是绑定您自己的函数以粘贴,在其中,将剪贴板清空为字符串,然后在20ms超时后再次填充它,这样,当tkinter粘贴时,它不会粘贴任何内容。不过这并不理想,因为剪贴板上的任何图像或html都会被删除。另外,如果剪贴板为空,则必须捕获错误。

self.ent.bind('<Control-v>', self.paste)
def paste(self, event):
    try: s = self.ent.clipboard_get()
    except: s = ''
    self.ent.clipboard_clear()
    #any other code you want to run on paste here
    self.ent.after(20, lambda: self.ent.clipboard_append(s))