如果大于列宽,则tkinter换行文本

时间:2014-02-15 20:09:37

标签: python tkinter window-resize ttk

我有3列动态内容。我希望每列占据窗口宽度的1/3并且可以调整大小。这不是问题:

from tkinter import *
from tkinter import ttk

root = Tk()


root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.columnconfigure(2, weight=1)

ttk.Label(root, text='Hello World', width=1).grid(column=0, row=0, padx=2, sticky=(N,W,E))
ttk.Label(root, text='Some txt', width=1).grid(column=1, row=0, padx=2, sticky=(N,W,E))
ttk.Label(root, text='Yet some more text', width=1).grid(column=2, row=0, padx=2, sticky=(N,W,E))

root.geometry('400x600')
root.minsize(220,300)
root.mainloop()

问题是内容是动态的,因此可以是任何宽度 - 当窗口缩小到minsize列3时不再适合。我想要包装文本,但需要这样做,以便在调整窗口大小时,文本将根据需要进行包装/解包。我尝试这个时的主要问题是 wraptext 是文本单位而宽度是像素,这意味着我无法编写自己的更新函数并在每次窗口调用它调整大小。

编辑:我不关心当我包装文本时窗口的垂直高度是什么

1 个答案:

答案 0 :(得分:2)

标签中文本的宽度以文本单位表示。 (找到http://effbot.org/tkinterbook/label.htm)所以你可以做的是

def display():
    window_width = root.winfo_width() #get current screen width
    wrapLen = screen_width/3
    tkk.Label(root, text="Some Text", width= ? ,wraplength=wrapLen).grid(column = 0, row=0)

可以使用if语句来决定宽度,具体取决于screen_width,例如它看起来像

if window_width == 100:
    width = 4.5
elif window_width == 300:
    width = 13.5

这些接近正确的值。 我计算宽度为400你可以得到一个标签宽度= 55,这意味着它应该是

if screen_width == 400:
    width = 18

如果您愿意,请自行完成这些计算。

SIDE NOTE

也是你做的一面注意事项

from tkinter import * 

从tkinter导入所有内容。然后导入

from tkinter import ttk

只是重新导入ttk位。

如果我是你,我会做的

import tkinter as tk

然后一切都变成了

root = tk.Tk()
tk.Label()
tk.Button()

等等。