disabled 状态没有出现的原因 . 如果将状态设置为 disabled 但是然后将绑定分配给 以将焦点显式设置为禁用的文本小部件,则可以选择并复制文本并突出显示 .
至于光标消失......可以说,这就是应该发生的事情 . 光标告诉用户“这是插入文本的位置” . 由于不会插入任何文本,因此具有该视觉线索会使用户感到困惑 . 如果真的很重要的话,你可以做的是在他们点击的任何地方插入一个小图像来模拟光标 .
要回答有关窗口小部件是否实际使用 insert 和 delete 方法的问题:实际基础窗口小部件上的方法是默认绑定使用的方法,因此在子类中覆盖它们无效 . 您需要重做所有默认绑定才能工作 . 这是可行的,但很多工作 .
不幸的是,这是Tcl编程真正发光的一个领域,因为您可以简单地禁用小部件的 insert 和 delete 命令 . 当然,你也可以直接在Tkinter中做到这一点,因为最终它运行tcl代码来完成所有事情,但这将涉及编写一些tcl代码,从Python编码器的角度来看这不是一个非常好的解决方案 .
我认为最好的解决方案是使用禁用状态,然后添加足够的绑定来做你想要的 .
这是一个简单的示例,通过明确设置焦点鼠标按钮单击 . 使用此代码,我可以单击并滑动以选择区域,或者双击或三击以选择单词和行:
import Tkinter as tk
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.text = tk.Text(width=40, height=20)
self.text.bind("<1>", self.set_focus)
self.text.insert("end", "\n".join(dir(tk.Tk)))
self.text.configure(state="disabled")
self.text.pack(fill="both", expand=True)
def set_focus(self, event):
'''Explicitly set focus, so user can select and copy text'''
self.text.focus_set()
if __name__ == "__main__":
app = SampleApp()
app.mainloop()