<p><code>disabled</code>状态在Mac上似乎不起作用的原因是它关闭了将焦点集中到小部件的绑定。如果没有焦点,Mac上的高亮显示就不会出现。如果将状态设置为<code>disabled</code>,但随后为<code><ButtonPress-1></code>分配绑定以显式地将焦点设置为禁用的文本小部件,则可以选择并复制文本,并显示高亮显示。在</p>
<p>至于光标消失。。。可以说,这就是应该发生的。光标告诉用户“这是插入文本的地方”。因为没有文本被插入,所以有视觉线索会让用户感到困惑。如果真的很重要的话,你可以做的是在他们点击的地方插入一个小图像来模拟光标。在</p>
<p>要回答您关于小部件是否实际使用<code>insert</code>和<code>delete</code>方法的问题:实际底层小部件上的方法是默认绑定使用的,因此在子类中重写它们没有任何效果。您需要重做所有的默认绑定才能正常工作。这是可行的,但要做很多工作。在</p>
<p>不幸的是,这是Tcl编程的一个亮点,因为您可以简单地禁用小部件的<code>insert</code>和{<cd5>}命令。当然,您也可以直接在Tkinter中实现这一点,因为它最终运行tcl代码来完成所有事情,但是这需要编写一些tcl代码,从Python代码编写者的角度来看,这不是一个很好的解决方案。在</p>
<p>我认为最好的解决方案是使用disabled状态,然后添加足够的绑定来执行您想要的操作。在</p>
<p>下面是一个简单的例子,它通过显式地将焦点设置在鼠标单击上。有了这段代码,我可以点击并滑动以选择区域,或者双击或三次单击来选择单词和行:</p>
<pre><code>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()
</code></pre>