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

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)

我的问题是,当我使用上面的代码时,覆盖的文本对于每个文本对象都是恒定大小的。文本本身是正确的,即它显示了我想要的字体大小的数字,只是没有以正确的字体大小显示。我尝试在大小定义中放入常量整数(按预期工作),并在上述2行代码后立即添加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的一个错误,但我仍然抱有一些希望,认为这里是我的逻辑错误。

请提供一个自包含的示例以重现您的问题。我刚刚创建了一个并且在这里运行得很好,所以我不知道您的问题出在哪里。 - mmgp
添加了。我觉得这似乎与递归有关。 - MNagy
这个bug已经在http://bugs.python.org/issue802310上报告了,但是修补它花费的时间太长了。你不需要真正使用`tkFont`,只需在调用`create_text`时传递`font=('Helvetica', tsize)`即可。 - mmgp
1个回答

2
我以前从未遇到过这种行为,看起来像是Tkinter的一个bug。好消息是,似乎有一个解决方法。如果你给每个字体一个唯一的名称,问题似乎就会消失。
下面的示例显示了多行文本,每行都有不同的字体大小:
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()

1
对于旧版本的Python,只有在两个实例的str(id(self))相同时才会发生这种情况。我记得可能会导致这种情况,这里是错误报告:http://bugs.python.org/issue802310。较新版本使用从1开始的简单计数器,因此永远不会发生这种情况。 - mmgp
@mmgp:我不太确定你想表达什么意思。我遇到了Python 2.7的问题。你所说的“新版本”是指3.x系列吗? - Bryan Oakley
这个错误报告已经超过9年了,很遗憾补丁只适用于Python 3.3。我还指出了这个错误以及为什么会发生(在报告中),这已经是众所周知的问题了。 - mmgp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接