2012-04-10 53 views
1

canvas.create_text(...)を使用して図面にテキストを追加しようとしています。私は、次のようにユニコードを使用して、やや成功している:Python tkinter canvasを使用した上付き文字の問題

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の仕事。私はそれが下付き文字について同じであると仮定しています。また、キャンバスをポストスクリプトとして保存すると、問題の上付き文字はなくなります...しかし、保存したイメージを印刷すると、上付き文字が返されます。

私のアプローチはまったく間違っていますか?私はちょうどこの仕事をするために探していますので、どんな助けも大歓迎です。ありがとうございました。

答えて

0

問題は、使用しているプラ​​ットフォームとフォントでUnicodeを処理していることが原因です。 説明したようにon wikipedia:以前はLatin-1 で扱われていた上付き1,2,3のフォントは異なるフォントをサポートしています。

私は固定サイズの問題に気付きませんでしたが、ほとんどのフォント(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() 
+0

美しく動作します。ありがとうございました! –

関連する問題