使用Python tkinter canvas上标的问题
问题描述:
我想使用canvas.create_text(...)将文本添加到图形。我已经有点成功以下列方式使用Unicode:使用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工作。我假设下标是一样的。另外,当我将canvas保存为postscript时,问题上标不见了,但是当我打印出保存的图像时,上标返回。
我的方法完全错了吗?我只是想做这个工作,所以任何帮助将不胜感激。谢谢。
答
您的问题来自您的平台和字体上的Unicode处理。 如解释on wikipedia:上标1,2和3以前处理拉丁文-1 ,从而得到不同的字体支持。
我没有注意到固定大小的问题,但在大多数字体(在Linux和MacOS上),1,2,3与4-9没有正确对齐。
我的建议是选择一种符合您需要的字体(您可以查看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()
工程很漂亮。谢谢! – 2012-04-13 12:56:58