使用自动换行创build可resize/多行Tkinter / ttk标签

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

用例是一个对话框,需要整体呈现多行文本(指令)块,而不需要修剪文本或使用滚动条。 父容器将具有足够的垂直空间来容纳窄的宽度。

我一直在试验Tkinter标签和消息小部件和ttk标签小部件没有成功。 看来,我需要硬编码一个像素wraplength值与这些控件自动wordwrap当他们的文本到达其容器的右边缘。 当然Tkinters几何pipe理器可以帮助我自动调整我的标签大小,并相应地更新其wraplength值?

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

这是一个如何可以做我上面描述的原型。 它的灵感来自于Bryan Oakley的提示,使用了Text部件和Stackoverflow上的以下文章: 在python的tkinter中,我该如何制作一个标签,以便用鼠标select文本?

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() 

Solutions Collecting From Web of "使用自动换行创build可resize/多行Tkinter / ttk标签"

不,Tk没有内置的功能来自动换行标签。 但是,通过绑定到标签的<Configure>事件并调整包装长度是可行的。 每当标签小部件被调整大小时,该绑定都会触发。

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

这里是代码:

 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 ) 

使用Message部件 :

“消息”小部件是“标签”的变体,用于显示多行消息。 消息小部件可以包装文本,并调整其宽度以保持给定的宽高比。