diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 67165298a99..92bbc106344 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -69,7 +69,7 @@ class ConfigDialog(Toplevel): self.resizable(height=FALSE, width=FALSE) self.transient(parent) self.protocol("WM_DELETE_WINDOW", self.cancel) - self.fontlist.focus_set() + self.fontpage.fontlist.focus_set() # XXX Decide whether to keep or delete these key bindings. # Key bindings for this dialog. # self.bind('', self.Cancel) #dismiss dialog, no save @@ -102,16 +102,16 @@ class ConfigDialog(Toplevel): activate_config_changes: Tell editors to reload. """ self.note = note = Notebook(self, width=450, height=450) - fontpage = self.create_page_font_tab() - highpage = self.create_page_highlight() - keyspage = self.create_page_keys() - genpage = self.create_page_general() - extpage = self.create_page_extensions() - note.add(fontpage, text='Fonts/Tabs') - note.add(highpage, text='Highlights') - note.add(keyspage, text=' Keys ') - note.add(genpage, text=' General ') - note.add(extpage, text='Extensions') + self.highpage = self.create_page_highlight() + self.fontpage = FontPage(note, self.highpage) + self.keyspage = self.create_page_keys() + self.genpage = self.create_page_general() + self.extpage = self.create_page_extensions() + note.add(self.fontpage, text='Fonts/Tabs') + note.add(self.highpage, text='Highlights') + note.add(self.keyspage, text=' Keys ') + note.add(self.genpage, text=' General ') + note.add(self.extpage, text='Extensions') note.enable_traversal() note.pack(side=TOP, expand=TRUE, fill=BOTH) self.create_action_buttons().pack(side=BOTTOM) @@ -129,8 +129,8 @@ class ConfigDialog(Toplevel): load_key_cfg load_general_cfg """ - self.load_font_cfg() - self.load_tab_cfg() + #self.load_font_cfg() + #self.load_tab_cfg() self.load_theme_cfg() self.load_key_cfg() self.load_general_cfg() @@ -219,203 +219,6 @@ class ConfigDialog(Toplevel): text=help_common+help_pages.get(page, '')) - def create_page_font_tab(self): - """Return frame of widgets for Font/Tabs tab. - - Fonts: Enable users to provisionally change font face, size, or - boldness and to see the consequence of proposed choices. Each - action set 3 options in changes structuree and changes the - corresponding aspect of the font sample on this page and - highlight sample on highlight page. - - Funtion load_font_cfg initializes font vars and widgets from - idleConf entries and tk. - - Fontlist: mouse button 1 click or up or down key invoke - on_fontlist_select(), which sets var font_name. - - Sizelist: clicking the menubutton opens the dropdown menu. A - mouse button 1 click or return key sets var font_size. - - Bold_toggle: clicking the box toggles var font_bold. - - Changing any of the font vars invokes var_changed_font, which - adds all 3 font options to changes and calls set_samples. - Set_samples applies a new font constructed from the font vars to - font_sample and to highlight_sample on the hightlight page. - - Tabs: Enable users to change spaces entered for indent tabs. - Changing indent_scale value with the mouse sets Var space_num, - which invokes the default callback to add an entry to - changes. Load_tab_cfg initializes space_num to default. - - Widget Structure: (*) widgets bound to self - frame (of tab_pages) - frame_font: LabelFrame - frame_font_name: Frame - font_name_title: Label - (*)fontlist: ListBox - font_name - scroll_font: Scrollbar - frame_font_param: Frame - font_size_title: Label - (*)sizelist: DynOptionMenu - font_size - (*)bold_toggle: Checkbutton - font_bold - frame_font_sample: Frame - (*)font_sample: Label - frame_indent: LabelFrame - indent_title: Label - (*)indent_scale: Scale - space_num - """ - parent = self.parent - self.font_name = tracers.add(StringVar(parent), self.var_changed_font) - self.font_size = tracers.add(StringVar(parent), self.var_changed_font) - self.font_bold = tracers.add(BooleanVar(parent), self.var_changed_font) - self.space_num = tracers.add(IntVar(parent), ('main', 'Indent', 'num-spaces')) - - # Create widgets: - # body and body section frames. - frame = Frame(self.note) - frame_font = LabelFrame( - frame, borderwidth=2, relief=GROOVE, text=' Base Editor Font ') - frame_indent = LabelFrame( - frame, borderwidth=2, relief=GROOVE, text=' Indentation Width ') - # frame_font. - frame_font_name = Frame(frame_font) - frame_font_param = Frame(frame_font) - font_name_title = Label( - frame_font_name, justify=LEFT, text='Font Face :') - self.fontlist = Listbox(frame_font_name, height=5, - takefocus=True, exportselection=FALSE) - self.fontlist.bind('', self.on_fontlist_select) - self.fontlist.bind('', self.on_fontlist_select) - self.fontlist.bind('', self.on_fontlist_select) - scroll_font = Scrollbar(frame_font_name) - scroll_font.config(command=self.fontlist.yview) - self.fontlist.config(yscrollcommand=scroll_font.set) - font_size_title = Label(frame_font_param, text='Size :') - self.sizelist = DynOptionMenu(frame_font_param, self.font_size, None) - self.bold_toggle = Checkbutton( - frame_font_param, variable=self.font_bold, - onvalue=1, offvalue=0, text='Bold') - frame_font_sample = Frame(frame_font, relief=SOLID, borderwidth=1) - temp_font = tkFont.Font(parent, ('courier', 10, 'normal')) - self.font_sample = Label( - frame_font_sample, justify=LEFT, font=temp_font, - text='AaBbCcDdEe\nFfGgHhIiJj\n1234567890\n#:+=(){}[]') - # frame_indent. - indent_title = Label( - frame_indent, justify=LEFT, - text='Python Standard: 4 Spaces!') - self.indent_scale = Scale( - frame_indent, variable=self.space_num, - orient='horizontal', tickinterval=2, from_=2, to=16) - - # Pack widgets: - # body. - frame_font.pack(side=LEFT, padx=5, pady=5, expand=TRUE, fill=BOTH) - frame_indent.pack(side=LEFT, padx=5, pady=5, fill=Y) - # frame_font. - frame_font_name.pack(side=TOP, padx=5, pady=5, fill=X) - frame_font_param.pack(side=TOP, padx=5, pady=5, fill=X) - font_name_title.pack(side=TOP, anchor=W) - self.fontlist.pack(side=LEFT, expand=TRUE, fill=X) - scroll_font.pack(side=LEFT, fill=Y) - font_size_title.pack(side=LEFT, anchor=W) - self.sizelist.pack(side=LEFT, anchor=W) - self.bold_toggle.pack(side=LEFT, anchor=W, padx=20) - frame_font_sample.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH) - self.font_sample.pack(expand=TRUE, fill=BOTH) - # frame_indent. - frame_indent.pack(side=TOP, fill=X) - indent_title.pack(side=TOP, anchor=W, padx=5) - self.indent_scale.pack(side=TOP, padx=5, fill=X) - - return frame - - def load_font_cfg(self): - """Load current configuration settings for the font options. - - Retrieve current font with idleConf.GetFont and font families - from tk. Setup fontlist and set font_name. Setup sizelist, - which sets font_size. Set font_bold. Setting font variables - calls set_samples (thrice). - """ - configured_font = idleConf.GetFont(self, 'main', 'EditorWindow') - font_name = configured_font[0].lower() - font_size = configured_font[1] - font_bold = configured_font[2]=='bold' - - # Set editor font selection list and font_name. - fonts = list(tkFont.families(self)) - fonts.sort() - for font in fonts: - self.fontlist.insert(END, font) - self.font_name.set(font_name) - lc_fonts = [s.lower() for s in fonts] - try: - current_font_index = lc_fonts.index(font_name) - self.fontlist.see(current_font_index) - self.fontlist.select_set(current_font_index) - self.fontlist.select_anchor(current_font_index) - self.fontlist.activate(current_font_index) - except ValueError: - pass - # Set font size dropdown. - self.sizelist.SetMenu(('7', '8', '9', '10', '11', '12', '13', '14', - '16', '18', '20', '22', '25', '29', '34', '40'), - font_size) - # Set font weight. - self.font_bold.set(font_bold) - - def var_changed_font(self, *params): - """Store changes to font attributes. - - 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.font_name.get() - changes.add_option('main', 'EditorWindow', 'font', value) - value = self.font_size.get() - changes.add_option('main', 'EditorWindow', 'font-size', value) - value = self.font_bold.get() - changes.add_option('main', 'EditorWindow', 'font-bold', value) - self.set_samples() - - def on_fontlist_select(self, event): - """Handle selecting a font from the list. - - Event can result from either mouse click or Up or Down key. - Set font_name and example displays to selection. - """ - font = self.fontlist.get( - ACTIVE if event.type.name == 'KeyRelease' else ANCHOR) - self.font_name.set(font.lower()) - - def set_samples(self, event=None): - """Update update both screen samples with the font settings. - - Called on font initialization and change events. - Accesses font_name, font_size, and font_bold Variables. - Updates font_sample and hightlight page highlight_sample. - """ - font_name = self.font_name.get() - font_weight = tkFont.BOLD if self.font_bold.get() else tkFont.NORMAL - new_font = (font_name, self.font_size.get(), font_weight) - self.font_sample['font'] = new_font - self.highlight_sample['font'] = new_font - - def load_tab_cfg(self): - """Load current configuration settings for the tab options. - - Attributes updated: - space_num: Set to value from idleConf. - """ - # Set indent sizes. - space_num = idleConf.GetOption( - 'main', 'Indent', 'num-spaces', default=4, type='int') - self.space_num.set(space_num) - def create_page_highlight(self): """Return frame of widgets for Highlighting tab. @@ -505,7 +308,7 @@ class ConfigDialog(Toplevel): frame_theme = LabelFrame(frame, borderwidth=2, relief=GROOVE, text=' Highlighting Theme ') #frame_custom - self.highlight_sample=Text( + text = self.highlight_sample = frame.highlight_sample = Text( frame_custom, relief=SOLID, borderwidth=1, font=('courier', 12, ''), cursor='hand2', width=21, height=13, takefocus=FALSE, highlightthickness=0, wrap=NONE) @@ -1829,6 +1632,219 @@ class ConfigDialog(Toplevel): self.ext_userCfg.Save() +class FontPage(Frame): + + def __init__(self, parent, highpage): + super().__init__(parent) + self.parent = parent + self.highlight_sample = highpage.highlight_sample + self.create_page_font_tab() + self.load_font_cfg() + self.load_tab_cfg() + + def create_page_font_tab(self): + """Return frame of widgets for Font/Tabs tab. + + Fonts: Enable users to provisionally change font face, size, or + boldness and to see the consequence of proposed choices. Each + action set 3 options in changes structuree and changes the + corresponding aspect of the font sample on this page and + highlight sample on highlight page. + + Function load_font_cfg initializes font vars and widgets from + idleConf entries and tk. + + Fontlist: mouse button 1 click or up or down key invoke + on_fontlist_select(), which sets var font_name. + + Sizelist: clicking the menubutton opens the dropdown menu. A + mouse button 1 click or return key sets var font_size. + + Bold_toggle: clicking the box toggles var font_bold. + + Changing any of the font vars invokes var_changed_font, which + adds all 3 font options to changes and calls set_samples. + Set_samples applies a new font constructed from the font vars to + font_sample and to highlight_sample on the hightlight page. + + Tabs: Enable users to change spaces entered for indent tabs. + Changing indent_scale value with the mouse sets Var space_num, + which invokes the default callback to add an entry to + changes. Load_tab_cfg initializes space_num to default. + + Widget Structure: (*) widgets bound to self + frame (of tab_pages) + frame_font: LabelFrame + frame_font_name: Frame + font_name_title: Label + (*)fontlist: ListBox - font_name + scroll_font: Scrollbar + frame_font_param: Frame + font_size_title: Label + (*)sizelist: DynOptionMenu - font_size + (*)bold_toggle: Checkbutton - font_bold + frame_font_sample: Frame + (*)font_sample: Label + frame_indent: LabelFrame + indent_title: Label + (*)indent_scale: Scale - space_num + """ + parent = self.parent + self.font_name = tracers.add(StringVar(parent), self.var_changed_font) + self.font_size = tracers.add(StringVar(parent), self.var_changed_font) + self.font_bold = tracers.add(BooleanVar(parent), self.var_changed_font) + self.space_num = tracers.add(IntVar(self), ('main', 'Indent', 'num-spaces')) + + # Create widgets: + # body and body section frames. + frame = self + frame_font = LabelFrame( + frame, borderwidth=2, relief=GROOVE, text=' Base Editor Font ') + frame_indent = LabelFrame( + frame, borderwidth=2, relief=GROOVE, text=' Indentation Width ') + # frame_font. + frame_font_name = Frame(frame_font) + frame_font_param = Frame(frame_font) + font_name_title = Label( + frame_font_name, justify=LEFT, text='Font Face :') + self.fontlist = Listbox(frame_font_name, height=5, + takefocus=True, exportselection=FALSE) + self.fontlist.bind('', self.on_fontlist_select) + self.fontlist.bind('', self.on_fontlist_select) + self.fontlist.bind('', self.on_fontlist_select) + scroll_font = Scrollbar(frame_font_name) + scroll_font.config(command=self.fontlist.yview) + self.fontlist.config(yscrollcommand=scroll_font.set) + font_size_title = Label(frame_font_param, text='Size :') + self.sizelist = DynOptionMenu(frame_font_param, self.font_size, None) + self.bold_toggle = Checkbutton( + frame_font_param, variable=self.font_bold, + onvalue=1, offvalue=0, text='Bold') + frame_font_sample = Frame(frame_font, relief=SOLID, borderwidth=1) + temp_font = tkFont.Font(parent, ('courier', 10, 'normal')) + self.font_sample = Label( + frame_font_sample, justify=LEFT, font=temp_font, + text='AaBbCcDdEe\nFfGgHhIiJj\n1234567890\n#:+=(){}[]') + # frame_indent. + indent_title = Label( + frame_indent, justify=LEFT, + text='Python Standard: 4 Spaces!') + self.indent_scale = Scale( + frame_indent, variable=self.space_num, + orient='horizontal', tickinterval=2, from_=2, to=16) + + # Pack widgets: + # body. + frame_font.pack(side=LEFT, padx=5, pady=5, expand=TRUE, fill=BOTH) + frame_indent.pack(side=LEFT, padx=5, pady=5, fill=Y) + # frame_font. + frame_font_name.pack(side=TOP, padx=5, pady=5, fill=X) + frame_font_param.pack(side=TOP, padx=5, pady=5, fill=X) + font_name_title.pack(side=TOP, anchor=W) + self.fontlist.pack(side=LEFT, expand=TRUE, fill=X) + scroll_font.pack(side=LEFT, fill=Y) + font_size_title.pack(side=LEFT, anchor=W) + self.sizelist.pack(side=LEFT, anchor=W) + self.bold_toggle.pack(side=LEFT, anchor=W, padx=20) + frame_font_sample.pack(side=TOP, padx=5, pady=5, expand=TRUE, fill=BOTH) + self.font_sample.pack(expand=TRUE, fill=BOTH) + # frame_indent. + frame_indent.pack(side=TOP, fill=X) + indent_title.pack(side=TOP, anchor=W, padx=5) + self.indent_scale.pack(side=TOP, padx=5, fill=X) + + return frame + + def load_font_cfg(self): + """Load current configuration settings for the font options. + + Retrieve current font with idleConf.GetFont and font families + from tk. Setup fontlist and set font_name. Setup sizelist, + which sets font_size. Set font_bold. Call set_samples. + """ + configured_font = idleConf.GetFont(self, 'main', 'EditorWindow') + font_name = configured_font[0].lower() + font_size = configured_font[1] + font_bold = configured_font[2]=='bold' + + # Set editor font selection list and font_name. + fonts = list(tkFont.families(self)) + fonts.sort() + for font in fonts: + self.fontlist.insert(END, font) + self.font_name.set(font_name) + lc_fonts = [s.lower() for s in fonts] + try: + current_font_index = lc_fonts.index(font_name) + self.fontlist.see(current_font_index) + self.fontlist.select_set(current_font_index) + self.fontlist.select_anchor(current_font_index) + self.fontlist.activate(current_font_index) + except ValueError: + pass + # Set font size dropdown. + self.sizelist.SetMenu(('7', '8', '9', '10', '11', '12', '13', '14', + '16', '18', '20', '22', '25', '29', '34', '40'), + font_size) + # Set font weight. + self.font_bold.set(font_bold) + self.set_samples() + + def var_changed_font(self, *params): + """Store changes to font attributes. + + 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.font_name.get() + changes.add_option('main', 'EditorWindow', 'font', value) + value = self.font_size.get() + changes.add_option('main', 'EditorWindow', 'font-size', value) + value = self.font_bold.get() + changes.add_option('main', 'EditorWindow', 'font-bold', value) + self.set_samples() + + def on_fontlist_select(self, event): + """Handle selecting a font from the list. + + Event can result from either mouse click or Up or Down key. + Set font_name and example displays to selection. + """ + font = self.fontlist.get( + ACTIVE if event.type.name == 'KeyRelease' else ANCHOR) + self.font_name.set(font.lower()) + + def set_samples(self, event=None): + """Update update both screen samples with the font settings. + + Called on font initialization and change events. + Accesses font_name, font_size, and font_bold Variables. + Updates font_sample and hightlight page highlight_sample. + """ + font_name = self.font_name.get() + font_weight = tkFont.BOLD if self.font_bold.get() else tkFont.NORMAL + new_font = (font_name, self.font_size.get(), font_weight) + self.font_sample['font'] = new_font + self.highlight_sample['font'] = new_font + + def load_tab_cfg(self): + """Load current configuration settings for the tab options. + + Attributes updated: + space_num: Set to value from idleConf. + """ + # Set indent sizes. + space_num = idleConf.GetOption( + 'main', 'Indent', 'num-spaces', default=4, type='int') + self.space_num.set(space_num) + + def var_changed_space_num(self, *params): + "Store change to indentation size." + value = self.space_num.get() + changes.add_option('main', 'Indent', 'num-spaces', value) + + class VarTrace: """Maintain Tk variables trace state.""" diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index aff3c2fdc3b..8da726b80c0 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -9,7 +9,7 @@ requires('gui') import unittest from unittest import mock from idlelib.idle_test.mock_idle import Func -from tkinter import Tk, IntVar, BooleanVar, DISABLED, NORMAL +from tkinter import Tk, Frame, IntVar, BooleanVar, DISABLED, NORMAL from idlelib import config from idlelib.configdialog import idleConf, changes, tracers @@ -47,7 +47,7 @@ def tearDownModule(): del root -class FontTest(unittest.TestCase): +class FontPageTest(unittest.TestCase): """Test that font widgets enable users to make font changes. Test that widget actions set vars, that var changes add three @@ -56,11 +56,15 @@ class FontTest(unittest.TestCase): """ @classmethod def setUpClass(cls): - dialog.set_samples = Func() # Mask instance method. + page = cls.page = dialog.fontpage + #dialog.note.insert(0, page, text='copy') + #dialog.note.add(page, text='copyfgfg') + dialog.note.select(page) + page.set_samples = Func() # Mask instance method. @classmethod def tearDownClass(cls): - del dialog.set_samples # Unmask instance method. + del cls.page.set_samples # Unmask instance method. def setUp(self): changes.clear() @@ -68,7 +72,8 @@ class FontTest(unittest.TestCase): def test_load_font_cfg(self): # Leave widget load test to human visual check. # TODO Improve checks when add IdleConf.get_font_values. - d = dialog + tracers.detach() + d = self.page d.font_name.set('Fake') d.font_size.set('1') d.font_bold.set(True) @@ -77,16 +82,17 @@ class FontTest(unittest.TestCase): self.assertNotEqual(d.font_name.get(), 'Fake') self.assertNotEqual(d.font_size.get(), '1') self.assertFalse(d.font_bold.get()) - self.assertEqual(d.set_samples.called, 3) + self.assertEqual(d.set_samples.called, 1) + tracers.attach() def test_fontlist_key(self): # Up and Down keys should select a new font. - - if dialog.fontlist.size() < 2: - cls.skipTest('need at least 2 fonts') - fontlist = dialog.fontlist + d = self.page + if d.fontlist.size() < 2: + self.skipTest('need at least 2 fonts') + fontlist = d.fontlist fontlist.activate(0) - font = dialog.fontlist.get('active') + font = d.fontlist.get('active') # Test Down key. fontlist.focus_force() @@ -96,7 +102,7 @@ class FontTest(unittest.TestCase): down_font = fontlist.get('active') self.assertNotEqual(down_font, font) - self.assertIn(dialog.font_name.get(), down_font.lower()) + self.assertIn(d.font_name.get(), down_font.lower()) # Test Up key. fontlist.focus_force() @@ -106,14 +112,14 @@ class FontTest(unittest.TestCase): up_font = fontlist.get('active') self.assertEqual(up_font, font) - self.assertIn(dialog.font_name.get(), up_font.lower()) + self.assertIn(d.font_name.get(), up_font.lower()) def test_fontlist_mouse(self): # Click on item should select that item. - - if dialog.fontlist.size() < 2: + d = self.page + if d.fontlist.size() < 2: cls.skipTest('need at least 2 fonts') - fontlist = dialog.fontlist + fontlist = d.fontlist fontlist.activate(0) # Select next item in listbox @@ -129,17 +135,17 @@ class FontTest(unittest.TestCase): font1 = fontlist.get(1) select_font = fontlist.get('anchor') self.assertEqual(select_font, font1) - self.assertIn(dialog.font_name.get(), font1.lower()) + self.assertIn(d.font_name.get(), font1.lower()) def test_sizelist(self): # Click on number shouod select that number - d = dialog + d = self.page d.sizelist.variable.set(40) self.assertEqual(d.font_size.get(), '40') def test_bold_toggle(self): # Click on checkbutton should invert it. - d = dialog + d = self.page d.font_bold.set(False) d.bold_toggle.invoke() self.assertTrue(d.font_bold.get()) @@ -154,7 +160,7 @@ class FontTest(unittest.TestCase): default_font = idleConf.GetFont(root, 'main', 'EditorWindow') default_size = str(default_font[1]) default_bold = default_font[2] == 'bold' - d = dialog + d = self.page d.font_size.set(default_size) d.font_bold.set(default_bold) d.set_samples.called = 0 @@ -183,7 +189,7 @@ class FontTest(unittest.TestCase): self.assertEqual(d.set_samples.called, 3) def test_set_samples(self): - d = dialog + d = self.page del d.set_samples # Unmask method for test d.font_sample, d.highlight_sample = {}, {} d.font_name.set('test') @@ -201,16 +207,21 @@ class FontTest(unittest.TestCase): class IndentTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.page = dialog.fontpage + def test_load_tab_cfg(self): - d = dialog + d = self.page d.space_num.set(16) d.load_tab_cfg() self.assertEqual(d.space_num.get(), 4) def test_indent_scale(self): + d = self.page changes.clear() - dialog.indent_scale.set(26) - self.assertEqual(dialog.space_num.get(), 16) + d.indent_scale.set(20) + self.assertEqual(d.space_num.get(), 16) self.assertEqual(mainpage, {'Indent': {'num-spaces': '16'}}) @@ -234,8 +245,10 @@ class GeneralTest(unittest.TestCase): """ @classmethod def setUpClass(cls): - # Mask instance methods used by help functions. d = dialog + # Select General tab so can force focus on helplist. + d.note.select(d.genpage) + # Mask instance methods used by help functions. d.set = d.set_add_delete_state = Func() d.upc = d.update_help_changes = Func() @@ -311,9 +324,8 @@ class GeneralTest(unittest.TestCase): helplist.event_generate('', x=x, y=y) helplist.event_generate('', x=x, y=y) helplist.event_generate('', x=x, y=y) - # The following fail after the switch to - # self.assertEqual(helplist.get('anchor'), 'source') - # self.assertTrue(d.set.called) + self.assertEqual(helplist.get('anchor'), 'source') + self.assertTrue(d.set.called) self.assertFalse(d.upc.called) def test_set_add_delete_state(self): diff --git a/Misc/NEWS.d/next/IDLE/2017-07-30-01-00-58.bpo-31004.m8cc1t.rst b/Misc/NEWS.d/next/IDLE/2017-07-30-01-00-58.bpo-31004.m8cc1t.rst new file mode 100644 index 00000000000..47fed949d10 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2017-07-30-01-00-58.bpo-31004.m8cc1t.rst @@ -0,0 +1,4 @@ +IDLE - Factor FontPage(Frame) class from ConfigDialog. + +Slightly modified tests continue to pass. Fix General tests. Patch mostly by +Cheryl Sabella.