是否可以创建一个自动换行的多行标签,其大小与其父级的宽度同步?换句话说,当您更改记事本窗口的宽度时,记事本的自动换行行为。

该用例是一个对话框,需要完整地呈现多行文本块(指令),而无需剪切文本或诉诸滚动条。父容器将有足够的垂直空间来容纳较窄的宽度。

我一直在尝试 Tkinter Label 和 Message 小部件以及 ttk Label 小部件,但没有成功。看来我需要对像素环绕长度值与像素环绕长度值进行硬编码。当这些控件的文本到达容器的右边缘时,它们会自动换行。当然,Tkinter 几何管理器可以帮助我自动调整标签大小并相应地更新其包裹长度值?

我应该查看文本小部件吗?如果是这样,是否可以隐藏文本小部件的边框,以便我可以将其用作带有自动换行的多行标签?

这是一个如何执行我上面描述的操作的原型。它的灵感来自 Bryan Oakley 使用文本小部件的提示以及 Stackoverflow 上的以下帖子:在python的tkinter中,如何制作一个标签以便可以用鼠标选择文本?

from Tkinter import *
master = Tk()

text = """
If tkinter is 8.5 or above you'll want the selection background to appear like it does when the widget is activated. Comment this out for older versions of Tkinter.

This is even more text.

The final line of our auto-wrapping label that supports clipboard copy.
""".strip()

frameLabel = Frame( master, padx=20, pady=20 )
frameLabel.pack()
w = Text( frameLabel, wrap='word', font='Arial 12 italic' )
w.insert( 1.0, text )
w.pack()

# - have selection background appear like it does when the widget is activated (Tkinter 8.5+)
# - have label background color match its parent background color via .cget('bg')
# - set relief='flat' to hide Text control borders
# - set state='disabled' to block changes to text (while still allowing selection/clipboard copy)
w.configure( bg=master.cget('bg'), relief='flat', state='disabled' )

mainloop()
有帮助吗?

解决方案

不,Tk 没有内置自动换行标签的功能。但是,通过绑定到 <Configure> 然后调整包装长度。每次调整标签小部件的大小时都会触发此绑定。

正如您所建议的,另一个选项是使用文本小部件。如果您愿意,可以完全关闭边界。当我想要自动换行的教学文本时,这一直是我的选择。

其他提示

使用 Message 小部件:

消息小部件是标签的变体,旨在显示多行消息。消息小部件可以换行文本,并调整其宽度以保持给定的宽高比。

这是代码:

entry = Label(self, text=text,
    anchor=NW, justify=LEFT,
    relief=RIDGE, bd=2)
def y(event, entry=entry):
  # FIXME: make this a global method, to prevent function object creation
  # for every label.
  pad = 0
  pad += int(str(entry['bd']))
  pad += int(str(entry['padx']))
  pad *= 2
  entry.configure(wraplength = event.width - pad)
entry.bind("<Configure>", y )
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top