如何强制 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 只有垂直滚动条,所以你必须使用Scrollbar
和Text
如果是一行,为什么不使用 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 [重复]