如果大于列宽,则自动换行



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

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

编辑:我不关心当我换行文本时窗口的垂直高度是多少

标签中文本的宽度以文本单位为单位。(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

如果您愿意,请自己进行这些计算。

旁注

也作为旁注你的做

from tkinter import * 

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

from tkinter import ttk

它只是重新导入 TTK 位。

如果我是你,我会做的

import tkinter as tk

然后一切都变成了

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

等等。

最新更新