看起来它没有那个属性,但它对我来说真的很有用。
答案 0 :(得分:63)
在输入Text
或{{1>之后,您必须将NORMAL
小工具的the state从DISABLED
更改为text.insert()
}}:
text.bind()
答案 1 :(得分:24)
text = Text(app, state='disabled', width=44, height=5)
插入前后,更改状态,否则无法更新
text.configure(state='normal')
text.insert('end', 'Some Text')
text.configure(state='disabled')
答案 2 :(得分:19)
tcl wiki详细描述了这个问题,并列出了三种可能的解决方案:
(2)或(3)是优选的,但是,解决方案并不明显。但是,a worked solution is available on the unpythonic wiki:
from Tkinter import Text
from idlelib.WidgetRedirector import WidgetRedirector
class ReadOnlyText(Text):
def __init__(self, *args, **kwargs):
Text.__init__(self, *args, **kwargs)
self.redirector = WidgetRedirector(self)
self.insert = self.redirector.register("insert", lambda *args, **kw: "break")
self.delete = self.redirector.register("delete", lambda *args, **kw: "break")
答案 3 :(得分:13)
非常简单的解决方案就是将任何按键绑定到一个返回“break”的函数,如下所示:
import Tkinter
root = Tkinter.Tk()
readonly = Tkinter.Text(root)
readonly.bind("<Key>", lambda e: "break")
答案 4 :(得分:7)
我没有50个声誉,因此我无法在nbro's回答中添加评论。尽管如此,这个答案所属的地方。
如果您的用例非常简单,nbro's text.bind(&#39;&lt; 1&gt;&#39;,lambda event:text.focus_set())代码解决了Craig McQueen在OS X上看到的交互性问题,但其他人在Windows和Linux上看不到。
OTOH,如果您的只读数据有任何上下文结构,那么您可能最终会使用 Tkinter.Text.insert ( position , text , taglist )将其添加到标签下的只读文本框窗口。您之所以这样做,是因为您希望部分数据能够根据上下文脱颖而出。可以通过调用 .Text.tag_config ()更改字体或颜色等来强调标记有标记的文字。同样,标记为已标记为的文字标签可以使用 .Text.tag_bind ()附加交互式绑定。这是使用these functions here的一个很好的例子。如果mark_for_paste()函数很好,那么了解数据上下文的mark_for_paste()函数可能更好。
答案 5 :(得分:4)
from Tkinter import *
root = Tk()
text = Text(root)
text.insert(END,"Some Text")
text.configure(state='disabled')
答案 6 :(得分:2)
如果要禁用用户编辑,请在Windows中使用此代码,并允许 Ctrl + C 复制屏幕文本:
def txtEvent(event):
if(event.state==12 and event.keysym=='c' ):
return
else:
return "break"
txt.bind("<Key>", lambda e: txtEvent(e))
答案 7 :(得分:2)
这就是我的方法。最后,将状态设置为禁用将使用户无法编辑文本框,但是要插入文本,则必须在编辑文本框之前将状态设置为正常。
from tkinter import *
text=Text(root)
text.pack()
text.config(state="normal")
text.insert(END, "Text goes here")
text.config(state="disabled")
答案 8 :(得分:2)
禁用文本小部件并不理想,因为您需要重新启用它才能更新它。更简单的方法是捕捉鼠标按钮和任何击键。所以:
textWidget.bind("<Button-1>", lambda e: "break")
textWidget.bind("<Key>", lambda e: "break")
似乎可以解决问题。这就是我在文本编辑器中禁用“行号”文本小部件的方式。第一行是更强大的。我不确定是否需要第二个,但它让我感觉更好。 :)
答案 9 :(得分:1)
如果选择文字不是你需要禁用状态是最简单的方法。为了支持复制,您可以使用外部实体 - Button
- 来完成工作。每当用户按下按钮时,Text
的内容将被复制到剪贴板。 Tk
具有处理剪贴板的内置支持(请参阅here),因此模拟Ctrl-C
的行为是一项简单的任务。如果您正在构建,请说出一个用于编写日志消息的控制台,您可以进一步添加Entry
,用户可以在其中指定要复制的日志消息的数量。
答案 10 :(得分:0)
您可以改用Label。标签可以通过程序进行编辑,而用户则不能编辑。
答案 11 :(得分:0)
许多人提到禁用状态后无法从文本小部件复制。对我来说,在Ubuntu Python 3.8.5上,复制问题原来是由小部件不关注Ubuntu(在Windows上可以运行)引起的。
当需要使用1)text.config(state = tkinter.NORMAL)以编程方式对其进行编辑时,我一直在使用将状态设置为Disabled然后切换状态的解决方案,例如2)编辑文本和3)文本.config(状态= tkinter.DISABLED)。 在Windows上,我可以正常地从小部件复制文本,但是在Ubuntu上,看起来好像我已经选择了文本,但是我无法复制它。
经过一些测试,结果证明只要文本小部件具有焦点,我就可以复制它。在Windows上,无论您处于什么状态都单击该文本小部件时,似乎会获得焦点,但是在Ubuntu上,单击文本小部件不会使其焦点。
因此,我通过将text.focus_set()绑定到鼠标单击事件“
import tkinter
root = tkinter.Tk()
text0 = tkinter.Text(root, state=tkinter.DISABLED)
text0.config(state=tkinter.NORMAL)
text0.insert(1.0, 'You can not copy or edit this text.')
text0.config(state=tkinter.DISABLED)
text0.pack()
text1 = tkinter.Text(root, state=tkinter.DISABLED)
text1.config(state=tkinter.NORMAL)
text1.insert(1.0, 'You can copy, but not edit this text.')
text1.config(state=tkinter.DISABLED)
text1.bind("<Button>", lambda event: text1.focus_set())
text1.pack()
至少对我来说,这是一个简单但有效的解决方案,希望其他人觉得它有用。