tkinter canvas:文本对象变量字体大小?

时间:2013-01-23 21:54:12

标签: python text tkinter tkinter-canvas

我正在使用tkinter画布制作漂亮的照片,并在圆圈上方叠加文字,如下图所示:

http://static.guim.co.uk/sys-images/Guardian/Pix/pictures/2012/11/6/1352220546059/Causes-of-deaths-graphic-008.jpg

我希望字体大小取决于圆圈大小所依赖的相同数字。

tempfont = tkFont.Font(family='Helvetica',size=int(round(ms*topnode[1])))
self.display.create_text(center[0],center[1],fill = "#FFFFFF",text = int(round(ms*topnode[1])),font = tempfont)

我的问题是,当我使用上面的代码时,重叠的文本是每个文本对象的常量。文本本身是正确的,因为它显示了我想要字体大小的数字,而不是正确的字体大小。我已经尝试在大小定义中放入常量整数(按照预期的方式工作),并在上面两行代码后立即添加del(tempfont),但我还没有找到解决这个问题的方法。 / p>

我做错了什么?

这是一个自包含的小程序,可以重现问题:

from Tkinter import *
import tkFont

class TestApp(Frame):
    def __init__(self, master=None, height = 160, width = 400):
        Frame.__init__(self, master)
        self.grid()
        self.createWidgets()

    def createWidgets(self):
        self.display = Canvas(self, width = 800, height = 320, bg = "#FFFFFF")
        self.display.grid(row=0,column=0)

        def recurtext(tsize):
            if tsize > 20:
                recurtext(tsize-10)
            tempfont = tkFont.Font(family='Helvetica',size=tsize)
            self.display.create_text(800 - (tsize*12),160, text = str(tsize), font = tempfont)

        recurtext(60)

app = TestApp()
app.master.title("Test")
app.mainloop()

要点是recurtext递归地调整字体大小,shows写出该大小的字体大小......或者我认为它应该。也许这是tkinter的一个错误,但我仍然希望我在这里的逻辑中犯了一个错误。

1 个答案:

答案 0 :(得分:1)

我以前从未遇到过这种行为;它看起来像一个Tkinter错误。好消息是,似乎有一种解决方法。如果你给每个字体一个唯一的名称,问题似乎就会消失。

以下示例显示了多行,每行都有不同的字体大小:

import Tkinter as tk
import tkFont

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.display = tk.Canvas(self, width=400, height=600, background="black")
        self.display.pack(side="top", fill="both", expand=True)
        y = 10
        for size in range (2, 38, 2):
            tempfont = tkFont.Font(family='Helvetica',size=size, 
                                   name="font%s" % size)
            self.display.create_text(10, y, fill = "#FFFFFF",text = size, 
                                     font = tempfont, anchor="nw")
            y = y + tempfont.metrics()["linespace"]

if __name__ == "__main__":
    root = tk.Tk()
    frame = Example(parent=root)
    frame.pack(side="top", fill="both", expand=True)

    root.mainloop()