有没有办法让Tkinter文本小部件只读?

时间:2010-10-01 18:47:35

标签: python text tkinter

看起来它没有那个属性,但它对我来说真的很有用。

12 个答案:

答案 0 :(得分:63)

在输入Text或{{1>之后,您必须将NORMAL小工具的the stateDISABLED更改为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详细描述了这个问题,并列出了三种可能的解决方案:

  1. 其他答案中描述的禁用/启用技巧
  2. 替换插入/删除事件的绑定
  3. 与(2)相同,但将其包装在一个单独的小部件中。
  4. (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()绑定到鼠标单击事件“