制作tkinter.font.Font对象的副本而不更改其系列

时间:2018-02-19 08:42:10

标签: python tkinter fonts

如何制作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'}

1 个答案:

答案 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'}