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 のバグかもしれませんが、ここでロジックを間違えたのは私であるという希望をまだ持ち続けています。

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 に答える