diff -r 74fc1af57c72 Lib/idlelib/EditorWindow.py --- a/Lib/idlelib/EditorWindow.py Fri Jul 31 23:36:28 2015 +0200 +++ b/Lib/idlelib/EditorWindow.py Fri Jul 31 16:20:32 2015 -0700 @@ -230,13 +230,7 @@ vbar['command'] = text.yview vbar.pack(side=RIGHT, fill=Y) text['yscrollcommand'] = vbar.set - fontWeight = 'normal' - if idleConf.GetOption('main', 'EditorWindow', 'font-bold', type='bool'): - fontWeight='bold' - text.config(font=(idleConf.GetOption('main', 'EditorWindow', 'font'), - idleConf.GetOption('main', 'EditorWindow', - 'font-size', type='int'), - fontWeight)) + text.config(font=idleConf.GetFont(self.root, 'main', 'EditorWindow')) text_frame.pack(side=LEFT, fill=BOTH, expand=1) text.pack(side=TOP, fill=BOTH, expand=1) text.focus_set() @@ -797,13 +791,9 @@ def ResetFont(self): "Update the text widgets' font if it is changed" # Called from configDialog.py - fontWeight='normal' - if idleConf.GetOption('main','EditorWindow','font-bold',type='bool'): - fontWeight='bold' - self.text.config(font=(idleConf.GetOption('main','EditorWindow','font'), - idleConf.GetOption('main','EditorWindow','font-size', - type='int'), - fontWeight)) + + self.text.config(font=idleConf.GetFont(self.root, 'main', + 'EditorWindow')) def RemoveKeybindings(self): "Remove the keybindings before they are changed." diff -r 74fc1af57c72 Lib/idlelib/config-main.def --- a/Lib/idlelib/config-main.def Fri Jul 31 23:36:28 2015 +0200 +++ b/Lib/idlelib/config-main.def Fri Jul 31 16:20:32 2015 -0700 @@ -53,7 +53,7 @@ [EditorWindow] width= 80 height= 40 -font= courier +font= TkFixedFont font-size= 10 font-bold= 0 encoding= none diff -r 74fc1af57c72 Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py Fri Jul 31 23:36:28 2015 +0200 +++ b/Lib/idlelib/configDialog.py Fri Jul 31 16:20:32 2015 -0700 @@ -465,9 +465,9 @@ return frame def AttachVarCallbacks(self): - self.fontSize.trace_variable('w', self.VarChanged_fontSize) - self.fontName.trace_variable('w', self.VarChanged_fontName) - self.fontBold.trace_variable('w', self.VarChanged_fontBold) + self.fontSize.trace_variable('w', self.VarChanged_font) + self.fontName.trace_variable('w', self.VarChanged_font) + self.fontBold.trace_variable('w', self.VarChanged_font) self.spaceNum.trace_variable('w', self.VarChanged_spaceNum) self.colour.trace_variable('w', self.VarChanged_colour) self.builtinTheme.trace_variable('w', self.VarChanged_builtinTheme) @@ -484,15 +484,15 @@ self.autoSave.trace_variable('w', self.VarChanged_autoSave) self.encoding.trace_variable('w', self.VarChanged_encoding) - def VarChanged_fontSize(self, *params): + def VarChanged_font(self, *params): + '''When one font attribute changes, save them all, as they are + not independent from each other. In particular, when we are + overriding the default font, we need to write out everything. + ''' + value = self.fontName.get() + self.AddChangedItem('main', 'EditorWindow', 'font', value) value = self.fontSize.get() self.AddChangedItem('main', 'EditorWindow', 'font-size', value) - - def VarChanged_fontName(self, *params): - value = self.fontName.get() - self.AddChangedItem('main', 'EditorWindow', 'font', value) - - def VarChanged_fontBold(self, *params): value = self.fontBold.get() self.AddChangedItem('main', 'EditorWindow', 'font-bold', value) @@ -958,24 +958,22 @@ fonts.sort() for font in fonts: self.listFontName.insert(END, font) - configuredFont = idleConf.GetOption( - 'main', 'EditorWindow', 'font', default='courier') - lc_configuredFont = configuredFont.lower() - self.fontName.set(lc_configuredFont) + configuredFont = idleConf.GetFont(self, 'main', 'EditorWindow') + fontName = configuredFont[0].lower() + fontSize = configuredFont[1] + fontBold = 1 if configuredFont[2]=='bold' else 0 + self.fontName.set(fontName) lc_fonts = [s.lower() for s in fonts] - if lc_configuredFont in lc_fonts: - currentFontIndex = lc_fonts.index(lc_configuredFont) + if fontName in lc_fonts: + currentFontIndex = lc_fonts.index(fontName) self.listFontName.see(currentFontIndex) self.listFontName.select_set(currentFontIndex) self.listFontName.select_anchor(currentFontIndex) ##font size dropdown - fontSize = idleConf.GetOption( - 'main', 'EditorWindow', 'font-size', type='int', default='10') self.optMenuFontSize.SetMenu(('7', '8', '9', '10', '11', '12', '13', '14', '16', '18', '20', '22'), fontSize ) ##fontWeight - self.fontBold.set(idleConf.GetOption( - 'main', 'EditorWindow', 'font-bold', default=0, type='bool')) + self.fontBold.set(fontBold) ##font sample self.SetFontSample() diff -r 74fc1af57c72 Lib/idlelib/configHandler.py --- a/Lib/idlelib/configHandler.py Fri Jul 31 23:36:28 2015 +0200 +++ b/Lib/idlelib/configHandler.py Fri Jul 31 16:20:32 2015 -0700 @@ -22,6 +22,8 @@ import sys from configparser import ConfigParser +from tkinter import * +from tkinter.font import Font, nametofont class InvalidConfigType(Exception): pass class InvalidConfigSet(Exception): pass @@ -669,6 +671,32 @@ allHelpSources = (self.GetExtraHelpSourceList('default') + self.GetExtraHelpSourceList('user') ) return allHelpSources + + def GetFont(self, root, configType, section): + """Retrieve a font from configuration (font, font-size, font-bold) + Intercept the special value 'TkFixedFont' and substitute + the actual font, factoring in some tweaks if needed for + appearance sakes. + + The 'root' parameter can normally be any valid Tkinter widget. + + Return a tuple (family, size, weight) suitable for passing + to tkinter.Font + """ + family = self.GetOption(configType, section, 'font', default='courier') + size = self.GetOption(configType, section, 'font-size', type='int', + default='10') + bold = self.GetOption(configType, section, 'font-bold', default=0, + type='bool') + if (family == 'TkFixedFont'): + f = Font(name = 'TkFixedFont', exists = True, root = root) + actualFont = Font.actual(f) + family = actualFont['family'] + size = actualFont['size'] + if size < 0: + size = 10 # if font in pixels, ignore actual size + bold = 1 if actualFont['weight']=='bold' else 0 + return (family, size, 'bold' if bold else 'normal') def LoadCfgFiles(self): "Load all configuration files."