]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-33987: IDLE - use ttk Frame for ttk widgets (GH-11395)
authorTerry Jan Reedy <tjreedy@udel.edu>
Thu, 3 Jan 2019 03:04:06 +0000 (22:04 -0500)
committerGitHub <noreply@github.com>
Thu, 3 Jan 2019 03:04:06 +0000 (22:04 -0500)
13 files changed:
Lib/idlelib/autocomplete_w.py
Lib/idlelib/config_key.py
Lib/idlelib/configdialog.py
Lib/idlelib/debugger.py
Lib/idlelib/grep.py
Lib/idlelib/idle_test/test_searchbase.py
Lib/idlelib/query.py
Lib/idlelib/replace.py
Lib/idlelib/scrolledlist.py
Lib/idlelib/search.py
Lib/idlelib/searchbase.py
Lib/idlelib/tree.py
Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst [new file with mode: 0644]

index 9e0d336523d4799fe53450fabd69288e40b4edb6..7994bc0db170120fb8d6662172f40fc38b7082f5 100644 (file)
@@ -4,7 +4,7 @@ An auto-completion window for IDLE, used by the autocomplete extension
 import platform
 
 from tkinter import *
-from tkinter.ttk import Scrollbar
+from tkinter.ttk import Frame, Scrollbar
 
 from idlelib.autocomplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES
 from idlelib.multicall import MC_SHIFT
index 21e84a94c9ff547ad5efd1f117158066d86455e5..4478323fcc2c51eb07621289c23ecde52ba3f22d 100644 (file)
@@ -2,7 +2,7 @@
 Dialog for building Tkinter accelerator key bindings
 """
 from tkinter import Toplevel, Listbox, Text, StringVar, TclError
-from tkinter.ttk import Button, Checkbutton, Entry, Frame, Label, Scrollbar
+from tkinter.ttk import Frame, Button, Checkbutton, Entry, Label, Scrollbar
 from tkinter import messagebox
 import string
 import sys
index 229dc89874332259e8f20791c9ba186f14de6c5b..5fdaf82de4de7091490b943ca171a83942c7d164 100644 (file)
@@ -14,7 +14,7 @@ from tkinter import (Toplevel, Listbox, Text, Scale, Canvas,
                      TOP, BOTTOM, RIGHT, LEFT, SOLID, GROOVE,
                      NONE, BOTH, X, Y, W, E, EW, NS, NSEW, NW,
                      HORIZONTAL, VERTICAL, ANCHOR, ACTIVE, END)
-from tkinter.ttk import (Button, Checkbutton, Entry, Frame, Label, LabelFrame,
+from tkinter.ttk import (Frame, LabelFrame, Button, Checkbutton, Entry, Label,
                          OptionMenu, Notebook, Radiobutton, Scrollbar, Style)
 import tkinter.colorchooser as tkColorChooser
 import tkinter.font as tkFont
index 09f912c9af336dd4bd490039b5b20f2179d522a4..ccd03e46e161479925f0a7171e9e5a6f9363a8ad 100644 (file)
@@ -2,7 +2,7 @@ import bdb
 import os
 
 from tkinter import *
-from tkinter.ttk import Scrollbar
+from tkinter.ttk import Frame, Scrollbar
 
 from idlelib import macosx
 from idlelib.scrolledlist import ScrolledList
index 8cc293c380dec67f0fb3bc3819976b8100a5d9d8..873233ec15439cc495cb7140b31f3c5321b66762 100644 (file)
@@ -8,7 +8,7 @@ import os
 import sys
 
 from tkinter import StringVar, BooleanVar
-from tkinter.ttk import Checkbutton
+from tkinter.ttk import Checkbutton  # Frame imported in ...Base
 
 from idlelib.searchbase import SearchDialogBase
 from idlelib import searchengine
@@ -173,15 +173,18 @@ class GrepDialog(SearchDialogBase):
 
 def _grep_dialog(parent):  # htest #
     from tkinter import Toplevel, Text, SEL, END
-    from tkinter.ttk import Button
+    from tkinter.ttk import Frame, Button
     from idlelib.pyshell import PyShellFileList
+
     top = Toplevel(parent)
     top.title("Test GrepDialog")
     x, y = map(int, parent.geometry().split('+')[1:])
     top.geometry(f"+{x}+{y + 175}")
 
     flist = PyShellFileList(top)
-    text = Text(top, height=5)
+    frame = Frame(top)
+    frame.pack()
+    text = Text(frame, height=5)
     text.pack()
 
     def show_grep_dialog():
@@ -189,7 +192,7 @@ def _grep_dialog(parent):  # htest #
         grep(text, flist=flist)
         text.tag_remove(SEL, "1.0", END)
 
-    button = Button(top, text="Show GrepDialog", command=show_grep_dialog)
+    button = Button(frame, text="Show GrepDialog", command=show_grep_dialog)
     button.pack()
 
 if __name__ == "__main__":
index 46c3ad111d179336122f24604553589eb19053de..09a7fff51de1dc5bcbe0d8b65649bb7ceb584065 100644 (file)
@@ -4,7 +4,8 @@
 
 import unittest
 from test.support import requires
-from tkinter import Tk, Frame  ##, BooleanVar, StringVar
+from tkinter import Tk
+from tkinter.ttk import Frame
 from idlelib import searchengine as se
 from idlelib import searchbase as sdb
 from idlelib.idle_test.mock_idle import Func
@@ -97,11 +98,12 @@ class SearchDialogBaseTest(unittest.TestCase):
         self.dialog.top = self.root
         frame, label = self.dialog.make_frame()
         self.assertEqual(label, '')
-        self.assertIsInstance(frame, Frame)
+        self.assertEqual(str(type(frame)), "<class 'tkinter.ttk.Frame'>")
+        # self.assertIsInstance(frame, Frame) fails when test is run by
+        # test_idle not run from IDLE editor.  See issue 33987 PR.
 
         frame, label = self.dialog.make_frame('testlabel')
         self.assertEqual(label['text'], 'testlabel')
-        self.assertIsInstance(frame, Frame)
 
     def btn_test_setup(self, meth):
         self.dialog.top = self.root
index c2628cceb739781a96cd17d61ada0a8f477e1e61..f0b72553db87f7a0abdfaf817bf35ad60f105678 100644 (file)
@@ -1,6 +1,5 @@
 """
 Dialogs that query users and verify the answer before accepting.
-Use ttk widgets, limiting use to tcl/tk 8.5+, as in IDLE 3.6+.
 
 Query is the generic base class for a popup dialog.
 The user must either enter a valid answer or close the dialog.
index 83cf98756bdf8127978b8818ffe5cdfc96ea68ed..4a834eb7901e61ff980c1d46e1f4126539b3e5fa 100644 (file)
@@ -205,12 +205,12 @@ class ReplaceDialog(SearchDialogBase):
 
 def _replace_dialog(parent):  # htest #
     from tkinter import Toplevel, Text, END, SEL
-    from tkinter.ttk import Button
+    from tkinter.ttk import Frame, Button
 
-    box = Toplevel(parent)
-    box.title("Test ReplaceDialog")
+    top = Toplevel(parent)
+    top.title("Test ReplaceDialog")
     x, y = map(int, parent.geometry().split('+')[1:])
-    box.geometry("+%d+%d" % (x, y + 175))
+    top.geometry("+%d+%d" % (x, y + 175))
 
     # mock undo delegator methods
     def undo_block_start():
@@ -219,7 +219,9 @@ def _replace_dialog(parent):  # htest #
     def undo_block_stop():
         pass
 
-    text = Text(box, inactiveselectbackground='gray')
+    frame = Frame(top)
+    frame.pack()
+    text = Text(frame, inactiveselectbackground='gray')
     text.undo_block_start = undo_block_start
     text.undo_block_stop = undo_block_stop
     text.pack()
@@ -231,7 +233,7 @@ def _replace_dialog(parent):  # htest #
         replace(text)
         text.tag_remove(SEL, "1.0", END)
 
-    button = Button(box, text="Replace", command=show_replace)
+    button = Button(frame, text="Replace", command=show_replace)
     button.pack()
 
 if __name__ == '__main__':
index 10229b63629293caa246ccc346edea7956a6db26..71fd18ab19ec8ae0e101bed1b3f77c41a28aaf7e 100644 (file)
@@ -1,5 +1,5 @@
 from tkinter import *
-from tkinter.ttk import Scrollbar
+from tkinter.ttk import Frame, Scrollbar
 
 from idlelib import macosx
 
index 6223661c8e080a9b583d8a9fa927dbbf442bfdf6..6e5a0c7973c728712e7638ba43e05244e065a20b 100644 (file)
@@ -75,13 +75,16 @@ class SearchDialog(SearchDialogBase):
 def _search_dialog(parent):  # htest #
     "Display search test box."
     from tkinter import Toplevel, Text
-    from tkinter.ttk import Button
+    from tkinter.ttk import Frame, Button
 
-    box = Toplevel(parent)
-    box.title("Test SearchDialog")
+    top = Toplevel(parent)
+    top.title("Test SearchDialog")
     x, y = map(int, parent.geometry().split('+')[1:])
-    box.geometry("+%d+%d" % (x, y + 175))
-    text = Text(box, inactiveselectbackground='gray')
+    top.geometry("+%d+%d" % (x, y + 175))
+
+    frame = Frame(top)
+    frame.pack()
+    text = Text(frame, inactiveselectbackground='gray')
     text.pack()
     text.insert("insert","This is a sample string.\n"*5)
 
@@ -90,7 +93,7 @@ def _search_dialog(parent):  # htest #
         _setup(text).open(text)
         text.tag_remove('sel', '1.0', 'end')
 
-    button = Button(box, text="Search (selection ignored)", command=show_find)
+    button = Button(frame, text="Search (selection ignored)", command=show_find)
     button.pack()
 
 if __name__ == '__main__':
index 348db660e3e9121711385ece42c041601c97907a..f0e3d6f14ba49b75243faa28b09a30c3d370e5d7 100644 (file)
@@ -1,7 +1,7 @@
 '''Define SearchDialogBase used by Search, Replace, and Grep dialogs.'''
 
-from tkinter import Toplevel, Frame
-from tkinter.ttk import Entry, Label, Button, Checkbutton, Radiobutton
+from tkinter import Toplevel
+from tkinter.ttk import Frame, Entry, Label, Button, Checkbutton, Radiobutton
 
 
 class SearchDialogBase:
index 05f864657fb827903acfaa694bd1d44f881e4e1b..21426cbb33e0da063915005e668f1d878d47b304 100644 (file)
@@ -17,7 +17,7 @@
 import os
 
 from tkinter import *
-from tkinter.ttk import Scrollbar
+from tkinter.ttk import Frame, Scrollbar
 
 from idlelib.config import idleConf
 from idlelib import zoomheight
diff --git a/Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst b/Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst
new file mode 100644 (file)
index 0000000..289a65c
--- /dev/null
@@ -0,0 +1 @@
+Use ttk Frame for ttk widgets.