[Python-checkins] bpo-31004: IDLE: Factor out FontPage class from configdialog (step 1) (#2905)

Terry Jan Reedy webhook-mailer at python.org
Sun Jul 30 13:34:28 EDT 2017


https://github.com/python/cpython/commit/9397e2a87ed6e0e724ad71a0c751553620cb775e
commit: 9397e2a87ed6e0e724ad71a0c751553620cb775e
branch: master
author: csabella <cheryl.sabella at gmail.com>
committer: Terry Jan Reedy <tjreedy at udel.edu>
date: 2017-07-30T13:34:25-04:00
summary:

bpo-31004: IDLE: Factor out FontPage class from configdialog (step 1) (#2905)

The slightly modified tests continue to pass. The General test
broken by the switch to Notebook is fixed.
Patch mostly by Cheryl Sabella.

files:
A Misc/NEWS.d/next/IDLE/2017-07-30-01-00-58.bpo-31004.m8cc1t.rst
M Lib/idlelib/configdialog.py
M Lib/idlelib/idle_test/test_configdialog.py

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 @@ def __init__(self, parent, title='', _htest=False, _utest=False):
         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('<Escape>', self.Cancel) #dismiss dialog, no save
@@ -102,16 +102,16 @@ def create_widgets(self):
             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 @@ def load_configs(self):
             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 @@ def help(self):
                  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('<ButtonRelease-1>', self.on_fontlist_select)
-        self.fontlist.bind('<KeyRelease-Up>', self.on_fontlist_select)
-        self.fontlist.bind('<KeyRelease-Down>', 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 @@ def create_page_highlight(self):
         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 @@ def save_all_changed_extensions(self):
             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('<ButtonRelease-1>', self.on_fontlist_select)
+        self.fontlist.bind('<KeyRelease-Up>', self.on_fontlist_select)
+        self.fontlist.bind('<KeyRelease-Down>', 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 @@
 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 @@ def setUp(self):
     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 @@ def test_load_font_cfg(self):
         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 @@ def test_fontlist_key(self):
 
         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 @@ def test_fontlist_key(self):
 
         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 @@ def test_fontlist_mouse(self):
         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 @@ def test_font_set(self):
         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 @@ def test_font_set(self):
         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 @@ def test_set_samples(self):
 
 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 @@ def test_source_selected(self):
         helplist.event_generate('<Motion>', x=x, y=y)
         helplist.event_generate('<Button-1>', x=x, y=y)
         helplist.event_generate('<ButtonRelease-1>', 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.



More information about the Python-checkins mailing list