如何制作tkinter.font.Font
对象的副本而不更改family
选项?
以下是我使用的脚本及其输出。我惊讶地发现它的.copy
方法改变了字体的家族。
测试脚本:
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkFont
class App(ttk.Frame):
def __init__(self, parent):
ttk.Frame.__init__(self, parent)
self.parent = parent
self._defaultFont=tkFont.Font(family='Times',size='11',weight='normal')
self.setFont()
def setFont(self):
"""Customise Font styles"""
Font = self._defaultFont.copy()
FontBold = self._defaultFont.copy()
FontBold.config(weight='bold')
print('_defaultFont.configure = ', self._defaultFont.configure())
print('Font.configure = ', Font.configure())
print('Font.actual = ', Font.actual())
print('FontBold.configure = ', FontBold.configure())
print('FontBold.actual = ', FontBold.actual())
if __name__ == '__main__':
root = tk.Tk()
root.title('Test')
root.geometry('200x100')
app = App(root)
app.pack(expand=1, fill='both')
root.mainloop()
输出:
_defaultFont.configure = {'slant': 'roman', 'overstrike': 0, 'underline': 0, 'family': 'Times', 'size': 11, 'weight': 'normal'}
Font.configure = {'slant': 'roman', 'overstrike': 0, 'underline': 0, 'family': 'Nimbus Roman No9 L', 'size': 11, 'weight': 'normal'}
Font.actual = {'slant': 'roman', 'overstrike': 0, 'underline': 0, 'family': 'Nimbus Roman No9 L', 'size': 11, 'weight': 'normal'}
FontBold.configure = {'slant': 'roman', 'overstrike': 0, 'underline': 0, 'family': 'Nimbus Roman No9 L', 'size': 11, 'weight': 'bold'}
FontBold.actual = {'slant': 'roman', 'overstrike': 0, 'underline': 0, 'family': 'Nimbus Roman No9 L', 'size': 11, 'weight': 'bold'}
答案 0 :(得分:0)
当我使用无效字体系列(即tkinter.font.families()
中不存在的字体)创建tkinter.font.Font()
对象时,我的问题中描述的问题就出现了。因此,需要确保tkinter.font.families()
字体与.copy()
方法一起使用。
为了证明这一点,我调查了使用'Times'
和'Helvetica'
等字体的结果,这些字体不在我的Ubuntu 16.04.3系统中,而是使用{{1}这样的字体和'Ubuntu'
,它驻留在我的系统中。我调查的结果如下所示。他们表明,'URW Gothic L'
类.copy()
方法只有在tkinter.font.Font
报告所使用的字体时才会完全复制字体的属性。我用来调查我的问题的修订脚本如下所示。
如果未使用tkFont.families()中的字体:
tkinter.font.families()
如果使用tkFont.families()中的字体:
_defaultFont.configure = {'family': 'Times', 'size': 11, 'underline': 0, 'slant': 'roman', 'overstrike': 0, 'weight': 'normal'}
_defaultFont.actual = {'family': 'Nimbus Roman No9 L', 'size': 11, 'underline': 0, 'slant': 'roman', 'overstrike': 0, 'weight': 'normal'}
Font.configure = {'family': 'Nimbus Roman No9 L', 'size': 11, 'underline': 0, 'slant': 'roman', 'overstrike': 0, 'weight': 'normal'}
Font.actual = {'family': 'Nimbus Roman No9 L', 'size': 11, 'underline': 0, 'slant': 'roman', 'overstrike': 0, 'weight': 'normal'}
FontBold.configure = {'family': 'Nimbus Roman No9 L', 'size': 11, 'underline': 0, 'slant': 'roman', 'overstrike': 0, 'weight': 'bold'}
FontBold.actual = {'family': 'Nimbus Roman No9 L', 'size': 11, 'underline': 0, 'slant': 'roman', 'overstrike': 0, 'weight': 'bold'}
_defaultFont.configure = {'family': 'Helvetica', 'underline': 0, 'size': 11, 'weight': 'normal', 'slant': 'roman', 'overstrike': 0}
_defaultFont.actual = {'family': 'Nimbus Sans L', 'underline': 0, 'size': 11, 'weight': 'normal', 'slant': 'roman', 'overstrike': 0}
Font.configure = {'family': 'Nimbus Sans L', 'underline': 0, 'size': 11, 'weight': 'normal', 'slant': 'roman', 'overstrike': 0}
Font.actual = {'family': 'Nimbus Sans L', 'underline': 0, 'size': 11, 'weight': 'normal', 'slant': 'roman', 'overstrike': 0}
FontBold.configure = {'family': 'Nimbus Sans L', 'underline': 0, 'size': 11, 'weight': 'bold', 'slant': 'roman', 'overstrike': 0}
FontBold.actual = {'family': 'Nimbus Sans L', 'underline': 0, 'size': 11, 'weight': 'bold', 'slant': 'roman', 'overstrike': 0}
修订测试脚本:
Ubuntu in tkFont.families()
_defaultFont.configure = {'family': 'Ubuntu', 'weight': 'normal', 'slant': 'roman', 'size': 11, 'overstrike': 0, 'underline': 0}
_defaultFont.actual = {'family': 'Ubuntu', 'weight': 'normal', 'slant': 'roman', 'size': 11, 'overstrike': 0, 'underline': 0}
Font.configure = {'family': 'Ubuntu', 'weight': 'normal', 'slant': 'roman', 'size': 11, 'overstrike': 0, 'underline': 0}
Font.actual = {'family': 'Ubuntu', 'weight': 'normal', 'slant': 'roman', 'size': 11, 'overstrike': 0, 'underline': 0}
FontBold.configure = {'family': 'Ubuntu', 'weight': 'bold', 'slant': 'roman', 'size': 11, 'overstrike': 0, 'underline': 0}
FontBold.actual = {'family': 'Ubuntu', 'weight': 'bold', 'slant': 'roman', 'size': 11, 'overstrike': 0, 'underline': 0}
URW Gothic L in tkFont.families()
_defaultFont.configure = {'slant': 'roman', 'family': 'URW Gothic L', 'underline': 0, 'size': 11, 'overstrike': 0, 'weight': 'normal'}
_defaultFont.actual = {'slant': 'roman', 'family': 'URW Gothic L', 'underline': 0, 'size': 11, 'overstrike': 0, 'weight': 'normal'}
Font.configure = {'slant': 'roman', 'family': 'URW Gothic L', 'underline': 0, 'size': 11, 'overstrike': 0, 'weight': 'normal'}
Font.actual = {'slant': 'roman', 'family': 'URW Gothic L', 'underline': 0, 'size': 11, 'overstrike': 0, 'weight': 'normal'}
FontBold.configure = {'slant': 'roman', 'family': 'URW Gothic L', 'underline': 0, 'size': 11, 'overstrike': 0, 'weight': 'bold'}
FontBold.actual = {'slant': 'roman', 'family': 'URW Gothic L', 'underline': 0, 'size': 11, 'overstrike': 0, 'weight': 'bold'}