2019年9月27日 / 18,414次阅读 / Last Modified 2019年9月27日
tkinter
基本上tkinter中的控件,在创建的时候,都可以使用font字体参数,来控制控件上显示的字体,大小和样式。tkinter是Python的标准GUI库,支持的成熟度是最好的,编写GUI工具,应该优先选择tkinter。本文介绍tkinter模块中字体使用的相关技巧。
>>> root = tk.Tk()
>>> tk.Label(root, text='hello font', font=('microsoft yahei', 16, 'bold')).pack
>
>>> tk.Label(root, text='hello font', font=('microsoft yahei', 16, 'bold')).pack()
>>> tk.Label(root, text='hello font', font=('Times', 20, 'bold italic')).pack()
>>> tk.Label(root, text='hello font', font=('Times', 24, 'bold italic underline')).pack()
>>> tk.Label(root, text='hello font', font=('Times', 24, 'bold italic underline overstrike')).pack()
>>> tk.Label(root, text='default font').pack()
有了根窗口root后,在其上连续创建几个Label,使用不同的font测试效果,如下:
tuple的第1个参数是字体类型,第2个参数是字体大小,第3个参数的可选内容是:bold, italic, underline, overstrike。效果如上。注意默认的font,其实size很小,我自己的经验是8或者9,肯定比10要小。
我看网上大家都使用tkFont这个词,我也就拿来用了,对应的其实是tkinter.font这个模块。
import tkinter as tk
import tkinter.font as tkFont
root = tk.Tk() # must be here
f1 = tkFont.Font(family='microsoft yahei', size=16, weight='bold')
f2 = tkFont.Font(family='times', size=20, slant='italic')
f3 = tkFont.Font(family='Helvetica', size=24, underline=1, overstrike=1)
tk.Label(root, text='tkFont', font=f1).pack()
tk.Label(root, text='tkFont', font=f2).pack()
tk.Label(root, text='tkFont', font=f3).pack()
tk.Label(root, text='default font').pack()
root.mainloop()
weight默认是normal,可以写bold;slant默认是roman,可以写italic;underline和overstrike的取值为0或1。
这段代码在Win系统下运行效果如下:
一个细节:这段代码要正常运行,必须要先创建root窗口。
tkFont.families接口可以获取当前系统所有的支持的字体类型,即所有的family参数。
>>> root = tk.Tk()
>>> tkFont.families()
('Noto Sans Mono CJK TC', 'Lohit Kannada', 'Samyak Devanagari', 'Century Schoolbook L', 'OpenSymbol', 'Khmer OS System', 'Nakula', 'Chandas', 'Keraleeyam', 'Noto Sans Mono CJK TC', 'Mukti Narrow', 'Meera', 'Kalimati', 'KacstQurn', 'Gubbi', 'Noto Sans Mono CJK SC', 'Tibetan Machine Uni', 'Umpush', 'DejaVu Sans Mono', 'Purisa', 'Pothana2000', 'Noto Serif CJK JP', 'KacstBook', 'KacstLetter', 'Noto Serif CJK KR', 'Noto Sans CJK SC', 'Norasi', 'Loma', 'Karumbi', 'KacstDigital', 'KacstTitleL', 'mry_KacstQurn', 'URW Palladio L', 'Noto Serif CJK SC', 'Noto Serif CJK TC', 'Likhan', 'Padauk Book', 'Phetsarath OT', 'Sawasdee', 'Sahadeva', 'Noto Sans CJK TC', 'Tlwg Typist', 'Tlwg Typewriter', 'Samyak Tamil', 'Noto Sans CJK KR', 'URW Gothic L', 'Dingbats', 'URW Chancery L', 'Ubuntu', 'Noto Sans CJK JP', 'Noto Sans CJK SC', 'Chilanka', 'FreeSerif', 'Lohit Assamese', 'Padauk', 'AnjaliOldLipi', 'Ubuntu Condensed', 'Samyak Gujarati', 'ori1Uni', 'KacstOffice', 'DejaVu Sans', 'Kinnari', 'KacstArt', 'Lohit Odia', 'Tlwg Mono', 'aakar', 'Bitstream Charter', 'KacstOne', 'Mitra Mono', 'Kalapi', 'Khmer OS', 'Courier 10 Pitch', 'Laksaman', 'Liberation Sans Narrow', 'Liberation Mono', 'Nimbus Sans L', 'padmaa-Bold.1.1', 'Manjari', 'Noto Sans CJK TC', 'Ani', 'Rachana', 'Pagul', 'Lohit Telugu', 'Lohit Tamil Classical', 'Samanata', 'Droid Sans Fallback', 'Vemana2000', 'Standard Symbols L', 'Lohit Gujarati', 'KacstPen', 'RaghuMalayalam', 'KacstDecorative', 'Nimbus Mono L', 'Liberation Serif', 'Manjari', 'Lohit Malayalam', 'LKLUG', 'Noto Sans Mono CJK SC', 'Nimbus Roman No9 L', 'Ubuntu', 'KacstPoster', 'Liberation Sans', 'Manjari', 'Mukti Narrow', 'FreeSans', 'Noto Sans Mono CJK JP', 'Sarai', 'Lohit Devanagari', 'Noto Color Emoji', 'Uroob', 'Noto Mono', 'KacstNaskh', 'Dyuthi', 'Lohit Tamil', 'Tlwg Typo', 'Noto Sans CJK JP', 'KacstFarsi', 'Suruma', 'Lohit Bengali', 'Abyssinica SIL', 'Jamrul', 'Noto Sans Mono CJK KR', 'Waree', 'KacstTitle', 'padmaa', 'DejaVu Serif', 'Saab', 'Noto Sans CJK KR', 'Navilu', 'Gargi', 'Noto Sans Mono CJK KR', 'Garuda', 'Samyak Malayalam', 'Rekha', 'KacstScreen', 'Lohit Gurmukhi', 'FreeMono', 'Ubuntu Mono', 'URW Bookman L', 'Noto Sans Mono CJK JP')
返回的tuple里面,包含了系统所有支持的字体。显示代码记得使用等宽(monospace)字体哦。
tkFont对象有一个方法measure,可以获取字符串参数的像素宽度,也许有的事情,这个信息是有用的,方法如下:
import tkinter as tk
import tkinter.font as tkFont
root = tk.Tk()
f1 = tkFont.Font(family='microsoft yahei', size=16, weight='bold')
f2 = tkFont.Font(family='times', size=16, slant='italic')
f3 = tkFont.Font(family='Helvetica', size=16, underline=1, overstrike=1)
tk.Label(root, text='tkFont', font=f1).pack()
tk.Label(root, text=f1.measure('tkFont'), font=f1).pack()
tk.Label(root, text='tkFont', font=f2).pack()
tk.Label(root, text=f2.measure('tkFont'), font=f1).pack()
tk.Label(root, text='tkFont', font=f3).pack()
tk.Label(root, text=f3.measure('tkFont'), font=f1).pack()
tk.Label(root, text='default font').pack()
root.mainloop()
运行结果:
虽然这几个tkFont对象的size都是16,但是不同字体,不同效果,measure的结果还是不太一样。
以上就是对tkinter模块font部分使用的介绍。
-- EOF --
本文链接:https://www.pynote.net/archives/1220
前一篇:tklog:基于tkinter的日志控件
后一篇:设置tkinter窗体的透明度
©Copyright 麦新杰 Since 2019 Python笔记