【问题标题】:Fitting text into a rectangle (width x by height y) with tkinter使用 tkinter 将文本放入矩形(宽度 x x 高度 y)
【发布时间】:2017-01-11 16:22:32
【问题描述】:

我正在尝试制作一个程序,该程序将根据文本、字体和字体大小将文本放入矩形(x x y)中

这里是代码

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 但它似乎对我不起作用

【问题讨论】:

    标签: python fonts tkinter widget pixels


    【解决方案1】:

    您的代码的问题是您正在使用小部件的宽度,但在小部件实际布置在屏幕上并使其可见之前,宽度将为 1,因为实际宽度取决于许多因素直到发生这种情况才会出现。

    您无需将文本放入小部件中即可对其进行测量。您可以将字符串传递给font.measure(),它将返回以给定字体呈现该字符串所需的空间量。

    对于 python 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")
    

    【讨论】:

    • 我用的是python 3.4.1,你知道我在哪里可以找到Font()函数吗?
    【解决方案2】:

    实际上,我通过反复试验偶然发现了一种方法

    通过使用measure.update_idletasks(),它可以正确计算宽度并且可以正常工作! Bryan Oakley 肯定有一种更有效的方法,但我认为这种方法在其他情况下会很有用

    附:我不介意为获得漂亮、闪亮、青铜、自学徽章而投一些票;)

    【讨论】:

      【解决方案3】:

      小部件在打包之前不会有宽度。您需要将标签放入框架中,然后打包,然后忘记它。

      【讨论】:

      • 什么都没变,我打包还是不说line_width是1,标签也已经在frame里了
      猜你喜欢
      • 2019-05-25
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多