2012-04-10 4 views
1

canvas.create_text (...)를 사용하여 도면에 텍스트를 추가하려고합니다.파이썬 tkinter 캔버스를 사용하는 위 첨자 문제

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

문제는 플랫폼 및 글꼴에서 유니 코드를 처리 할 때 발생합니다. 설명한대로 on wikipedia : 이전에 Latin-1 으로 처리 한 위 첨자 1,2 및 3은 글꼴에서 다른 지원을 얻습니다.

고정 크기 문제는 알지 못했지만 대부분의 글꼴 (Linux 및 MacOS)에서 1,2,3은 4-9와 제대로 정렬되지 않았습니다.

내 조언은 필요에 맞는 글꼴을 선택하는 것입니다 (libre 고품질 글꼴을 제공하는 DejaVu 제품군을 참조하십시오).

다음은 글꼴이나 크기가 다른 위 첨자의 처리 방법을 보여주는 litte 응용 프로그램입니다.

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

아름답게 작동합니다. 고맙습니다! –