2016-09-03 4 views
0

Я пытаюсь создать программу, которая поместит текст в прямоугольник (x на y) в зависимости от текста, шрифта и размера шрифтаУстановка текста в прямоугольник (ширина x по высоте y) с tkinter

Вот код

def fit_text(screen, width, height, text, font): 
    measure_frame = Frame(screen) # frame 
    measure_frame.pack() 
    measure_frame.pack_forget() 
    measure = Label(measure_frame, font = font) # make a blank label 
    measure.grid(row = 0, column = 0) # put it in the frame 

    ########################################################## 
    # make a certain number of lines 
    ########################################################## 

    words = text.split(" ") 
    lines = [] 
    num = 0 
    previous = 0 
    while num <= len(words):     
     measure.config(text = " ".join(words[previous:num])) # change text 
     line_width = measure.winfo_width() # get the width 
     print(line_width) 
     if line_width >= width: # if the line is now too long 
      lines.append(" ".join(words[previous:num - 1])) # add the last vsion which wasn't too long 
      previous = num - 1 # previous is now different 
     num = num + 1 # next word 
    lines.append(" ".join(words[previous:])) # add the rest of it 
    return "\n".join(lines) 

from tkinter import *  
window = Tk() 
screen = Canvas(window) 
screen.pack() 
text = fit_text(screen, 200, 80, "i want to fit this text into a rectangle which is 200 pixels by 80 pixels", ("Purisa", 12)) 
screen.create_rectangle(100, 100, 300, 180) 
screen.create_text(105, 105, text = text, font = ("Purisa", 12), anchor = "nw") 

проблема с этим не важно, что текст на этикетке результат от measure.winfo_width() всегда 1. Here is where I found this from, но это не похоже на работу для меня

ответ

1

Проблема с вашим кодом заключается в том, что вы используете ширину виджета, но ширина будет равна 1, пока виджет не будет выложен на экране и не станет видимым, так как фактическая ширина зависит от количества факторов, которых нет, пока это не произойдет.

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

Для питона 3.x вы можете импортировать Font класс как это:

from tkinter.font import Font 

Для Python 2.x импортировать его из tkFont модуля:

from tkFont import Font 

Вы можете создать экземпляр Font, чтобы вы могли получить информацию об этом шрифте:

font = Font(family="Purisa", size=18) 
length = font.measure("Hello, world") 
print "result:", length 

Вы также можете получить высоту строки данного шрифта с помощью метода font.metrics(), придавая ей аргумент «linespace»:

height = font.metrics("linespace") 
+0

Я использую python 3.4.1, вы знаете, где я могу найти функцию Font()? –

+0

спасибо, я прошу вас помочь –

1

виджет не будет иметь ширину, пока она не будет упакована. Вам нужно поместить метку в рамку, затем упаковать ее, а затем забыть.

+0

ничего не изменилось, упаковал ли я его или нет, он все еще говорит, что line_width равно 1, метка также уже находится в кадре –

1

Я на самом деле наткнулся на способ сделать это путем проб и ошибок

С помощью measure.update_idletasks() он правильно вычисляет ширину, и он работает! У Брайана Окли определенно есть более эффективный способ сделать это, хотя я думаю, что этот метод будет полезен в других ситуациях.

P.S. Я бы не прочь проголосовать за хороший, блестящий, бронзовый значок с самообучением;)