如何强制 tkinter 文本小部件保持在一行

Posted

技术标签:

【中文标题】如何强制 tkinter 文本小部件保持在一行【英文标题】:How to force tkinter text widget to stay on one line 【发布时间】:2017-12-13 12:35:16 【问题描述】:

我想创建一个类似于 Label 的对象,但是我希望它也可以选择用于复制粘贴。我已经使用 Text 小部件这样做了:

class CopyLabel (Text):
    def __init__ (self, master, text = '', font = None):
        if font is None:
            super().__init__(master = master, height = 1,
                             borderwidth = 0, width = len(text),
                             bg = master['background'])
        else:
            super().__init__(master = master, height = 1,
                             borderwidth = 0, font = font,
                             width = len(text), bg = master['background'])
        self.insert(1.0, text)
        self.configure(state = 'disabled')

我最终用一个网格来显示这个小部件。但是,我随机发现最后 1 或 2 个字符没有显示。在对此进行调查时,似乎 Text 小部件正在将这些字符拆分为新行(选择文本时,可以向下拖动以查看第二行)。最大的问题是这种拆分的不可预测性(我尝试过 width = len(text) + 2,但我仍然偶尔会遇到这种行拆分行为)。有没有办法纠正这种行为?

编辑:设置 wrap = 'none' 修复了行拆分行为,但文本仍然被截断。现在我必须水平滚动而不是垂直滚动才能看到文本,但我想这与我提出的问题不同。

【问题讨论】:

也许wrap="none" - tk.Text(root, wrap='none') ? 您必须使用Scrollbar 来滚动它。或使用ttk.scrolledtext 更正:ttk.scrolledtext 只有垂直滚动条,所以你必须使用ScrollbarText 如果是一行,为什么不使用 Entry 小部件?它专门设计了一个单行输入。 实际上,我刚刚意识到是什么导致了问题。我正在更改文本的字体。由于并非所有字体的宽度都相同,因此它一直在切断一些文本。如果字体未更改,CopyLabel 小部件将按预期工作。 【参考方案1】:

您遇到的情况称为 包装,可以通过修改 Text 小部件的 wrap 选项来禁用,如下所示:

self['wrap'] = 'none'

self.config(wrap='none')

【讨论】:

修复了换行,但现在我显示的文本被截断了。无论如何要在不使文本宽度大于所需宽度的情况下解决这个问题? 您可以使用滚动条小部件,或者编写更复杂的方法来根据其内容动态调整小部件的大小。这是一个单独的问题,应该根据您想要的行为进行研究,如果您找不到解决方案,那么您应该在 SO 中提问。

以上是关于如何强制 tkinter 文本小部件保持在一行的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter:如何将文本小部件中输入的文本保存到新窗口中?

如何在python 3.4.x中的tkinter文本小部件中显示渲染的html内容

tkinter Text() 小部件上的 4096 个单行字符限制?

如何更改标签小部件中的文本大小,python tkinter [重复]

强制 Tkinter.ttk Treeview 小部件在缩小其列宽后调整大小

如何为 Tkinter 条目小部件设置默认文本