如何在Python中使用Tkinter创建填充窗口宽度的换行文本?

sam*_*yse 16 python tkinter

Label小部件不进行换行.Message小部件将换行文本,但强制它大致为方形.这是一个例子.

from Tkinter import *

root = Tk()
root.title("hello")

Message(root, text=48*'xxxxx ').grid(row=0, column=0, columnspan=3)

Label(root, text='Name:').grid(row=1, column=0)
Entry(root, width=50).grid(row=1, column=1)
Button(root, text="?").grid(row=1, column=2)

Button(root, text="Left").grid(row=2, column=0)
Button(root, text="Center").grid(row=2, column=1)
Button(root, text="Right").grid(row=2, column=2)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

我知道我可以用它aspect=700来改变形状,但硬编码这样的数字就是我想要避免的.

小智 31

Tkinter标签小部件确实换行.只是默认设置是不包装.要使标签上的文本换行设置"wraplength"参数,其单位为屏幕单位,因此请尝试wraplength = 50并根据需要进行调整.您还需要将"对齐"设置为LEFT,RIGHT或CENTER.希望有所帮助.

  • @JimDenny,屏幕单位是什么意思?我是新来的. (4认同)
  • 你可以发布一些代码吗?我不知道在哪里插入 WRAPLENGTH 所以这个答案没用。 (4认同)
  • 还可以在小部件上设置绑定,以便您可以在小部件更改大小时动态更改环绕长度。 (2认同)
  • @Brendan 只需将这些参数添加到标签小部件中即可。有关更多详细信息,请参阅 Uduak Akpan 的回答。 (2认同)

rem*_*rem 10

wraplength确实是正确答案,但它是固定宽度。如果您有动态调整大小,Label则需要wraplength在调整大小时进行更新。您可以通过绑定<Configure>事件来做到这一点:

label = tk.Label(root, text="My long text")
label.bind('<Configure>', lambda e: label.config(wraplength=label.winfo_width()))
Run Code Online (Sandbox Code Playgroud)

在某些配置中,我确实得到了稍微偏离的换行,即文本稍微偏离换行前的边缘Label。我还没有弄清楚这是否是由于字体、任何边距/填充或发生了什么造成的。label.winfo_width()我只是通过在将其输入之前减去固定数量来解决这个问题wraplength

  • 这是一个很好的解决方案,但实施可能会导致无限循环,因为 if 会在视图配置事件上调用视图配置。您可能希望将标签包装在 Frame 超级视图中,并将侦听该视图的事件绑定起来。 (2认同)

小智 8

welcomenote = Label(root, text="Your long text", font="helvetica 14", 
wraplength=300, justify="center")
welcomenote.pack()
Run Code Online (Sandbox Code Playgroud)