Высота этикетки Tkinter, чтобы соответствовать содержанию - PullRequest
1 голос
/ 03 сентября 2011

У меня есть ярлык, в который я собираюсь поместить содержимое разных размеров.Я хотел бы знать, насколько высоко мне нужно сделать ярлык, чтобы я мог изменить размер окна, чтобы оно оставалось одинаковым для разных размеров контента.У меня есть стратегия, но она кажется более сложной, чем должна быть.

Я хочу установить метку для заданной ширины и длины обтекания:

l = Label(root)
l['width'] = 30
l['wraplength'] = 244
l['text'] = "testing this"

Теперь я хочу запросить меткучтобы найти, сколько строк используется.l ['height'] остается на 0, поэтому лучшее, что я смог придумать, - это использование l.winfo_height () и преобразование высоты, заданной в пикселях, в число используемых строк.Ничто в dir (l), кажется, не дает мне информацию напрямую, но эта стратегия хрупка к изменениям шрифта и другим изменениям.

Любые предложения?

Обновление: использование предложения Брайана Окли (котороеаналогично тому, что я получил по usenet) у меня есть следующее приближение к решению (нуждается в полировке, например, не учитывает разрывы меток в пробеле):

import Tkinter as Tk
import tkFont
import random
import sys

def genstr (j):
    rno = random.randint(4,50)
    ret_val = str(j) + ":"
    for i in range (0, rno):
        ret_val += "hello" + str(i)
    return ret_val

def gendata (lh):
    ret_val = []
    for i in range(0,lh):
        ret_val.append (genstr (i))
    return ret_val

data = gendata (100)

root = Tk.Tk()
font = tkFont.Font(family='times', size=13)

class lines:
    def __init__ (self):
        self.lastct = 1   # remember where the cutoff was last work from there

    def count (self, text, cutoff = 400):
        global font
        no_lines = 1
        start_idx = 0
        idx = self.lastct

        while True:
            if idx > len (text):
                idx = len (text)

            # shrink from guessed value
            while font.measure (text[start_idx:idx - 1]) > cutoff:
                if idx <= start_idx:
                    print "error"
                    sys.exit ()
                else:
                    idx -= 1
                    self.lastct = idx - start_idx # adjust since was too big

            # increase from guessed value (note: if first shrunk then done)
            while (idx < len (text)
                   and font.measure (text[start_idx:idx]) < cutoff):
                idx += 1
                self.lastct = idx - start_idx     # adjust since was too small

            # next line has been determined
            print "*" + text[start_idx:idx-1] + "*"
            if idx == len(text) and font.measure (text[start_idx:]) < cutoff:
                return no_lines
            elif idx == len(text):
                return no_lines + 1
            else:
                no_lines += 1
                start_idx = idx - 1
                idx = start_idx + self.lastct

lin = lines()

for i in range(0,len(data)):
    lin.count(data[i], 450)

for i in range(0,min(len(data),10)):
    l = Tk.Label(root)
    l.pack()
    l['text'] = data[i]
    print i
    no = lin.count (data[i], 450)
    print "computed lines", no
    l['width'] = 50
    l['justify'] = Tk.LEFT
    l['anchor'] = 'w'
    l['wraplength'] = 450
    l['padx']=10
    l['pady'] = 5
    l['height'] = no
    l['font'] = font
    if i % 2 == 0:
        l['background'] = 'grey80'
    else:
        l['background'] = 'grey70'

root.mainloop()

1 Ответ

3 голосов
/ 05 сентября 2011

Вы правы, что атрибут height не меняется. Этот атрибут не говорит вам фактическую высоту, а только высоту, на которую он настроен. Фактическая высота зависит от таких факторов, как объем текста, длина переноса, шрифт и управление геометрией виджета.

tkinter У объектов шрифтов есть метод measure, который позволяет вам определить, какой длины и ширины строка для данного шрифта. Вы можете получить шрифт для виджета и использовать этот метод, чтобы определить, сколько места требуется для вашей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...