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