tkinter переносит текст, если он больше ширины столбца

У меня есть 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 больше не подходит. Я хочу обернуть текст, но мне нужно сделать это таким образом, чтобы при изменении размера окна текст был обернут / развернут по мере необходимости. Моя основная проблема, когда я пробовал это, заключалась в том, что wraptext находится в текстовых единицах, а ширина - в пикселях, это означает, что я не могу написать свою собственную функцию обновления и вызывать ее каждый раз, когда окно изменяется размер.

Изменить: меня не волнует, какова вертикальная высота окна, когда я оборачиваю текст


person user1205406    schedule 15.02.2014    source источник


Ответы (1)


Ширина текста на этикетке указывается в текстовых единицах. (найдено 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()

и так далее.

person Swapnull    schedule 18.02.2014
comment
Могу я спросить, откуда у вас преобразование текстовых единиц в пиксели - ваше деление на 22 и 2/9. Что делать, если я использую другой шрифт, как я могу рассчитать это преобразование. Также root.winfo_screenwidth () дает ширину экрана - root.winfo_width () дает ширину окна. это то, что вам нужно, если размер виджета будет изменен. Наконец, да, вы можете импортировать tkinter один раз, а не дважды, но это соглашение об импорте ttk отдельно, поэтому я это делаю. - person user1205406; 19.02.2014
comment
@ user1205406 Я сделал это через реализацию. Я установил геометрию как 400x600, а затем поместил метку на 0,0. Методом проб и ошибок, используя длинную строку в качестве текста меток, а затем изменяя ширину, пока метка просто не заполнила окно. Если вы хотите проверить это с другим шрифтом, просто измените шрифт и выполните этот процесс, но это не должно быть проблемой после того, как вы выбрали шрифт. Кроме того, если это соглашение, тогда круто и извините за то, что поднял его, я не видел (или, по крайней мере, отмечал) это соглашение раньше. - person Swapnull; 20.02.2014
comment
спасибо - жаль, что нет правильного способа вычислить это, но я могу справиться, проработав это для отдельных шрифтов. - person user1205406; 20.02.2014