4

我正在使用 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),但我还没有找到解决这个问题的方法。

我究竟做错了什么?

这是一个重现问题的独立小程序:

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 的一个错误,但我仍然抱有一些希望,即我是这里逻辑错误的人。

4

1 回答 1

2

我以前从未遇到过这种行为;它看起来像一个 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()
于 2013-01-23T22:47:01.593 回答