1

canvas.create_text(...) を使用してテキストを図面に追加しようとしています。次の方法でユニコードを使用して、ある程度成功しました。

mytext = u'U\u2076'  #U^6
canvas.create_text(xPos,yPos,text = mytext, font = ("Times","30")
canvas.pack()

動作しますが、フォント サイズを大きくすると、上付き文字 4,5,6,7,8,9,0 はサイズが大きくなりません。1,2,3のみが機能します。添え字も同じだと思います。また、キャンバスをポストスクリプトとして保存すると、問題の上付き文字はなくなりました...しかし、保存した画像を印刷すると、上付き文字が戻ります。

私のアプローチは完全に間違っていますか?私はこれを機能させたいと思っているだけなので、どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

0

問題は、プラットフォームとフォントでの Unicode の処理に起因します。ウィキペディアで説明されているように: 上付き文字 1、2、および 3 は、以前は Latin-1 で処理されていたため、フォントで異なるサポートを取得しています。

固定サイズの問題には気付きませんでしたが、ほとんどのフォント (Linux および MacOS) では、1、2、3 が 4 ~ 9 と適切に配置されていません。

私のアドバイスは、ニーズに合ったフォントを選択することです (自由で高品質のフォントを提供する DejaVu ファミリーを参照してください)。

これは、フォントやサイズが異なる上付き文字の処理を説明するための小さなアプリケーションです。

from Tkinter import *
import tkFont

master = Tk()

canvas = Canvas(master, width=600, height=150)
canvas.grid(row=0, column=0, columnspan=2, sticky=W+N+E+S)

list = Listbox(master)
for f in sorted(tkFont.families()):
    list.insert(END, f)

list.grid(row=1, column=0)

font_size= IntVar()
ruler = Scale(master, orient=HORIZONTAL, from_=1, to=200, variable=font_size)
ruler.grid(row=1, column=1, sticky=W+E)


def font_changed(*args):
    sel = list.curselection()
    font_name = list.get(sel[0]) if len(sel) > 0 else "Times"
    canvas.itemconfig(text_item, font=(font_name,font_size.get()))
    #force redrawing of the whole Canvas
    # dirty rectangle of text items has bug with "superscript" character
    canvas.event_generate("<Configure>")

def draw():
    supernumber_exception={1:u'\u00b9', 2:u'\u00b2', 3:u'\u00b3'}
    mytext =""
    for i in range(10):
        mytext += u'U'+ (supernumber_exception[i] if i in supernumber_exception else unichr(8304+i))+" "
    return canvas.create_text(50, 50,text = mytext, anchor=NW)

text_item = draw()

list.bind("<<ListboxSelect>>", font_changed)

font_size.trace("w", font_changed)
font_size.set(30)

master.grid_columnconfigure(0, weight=0)
master.grid_columnconfigure(1, weight=1)
master.grid_rowconfigure(0, weight=1)
master.grid_rowconfigure(1, weight=0)

master.mainloop()
于 2012-04-12T12:03:43.767 に答える