From 47006071ed1afc8ae90b4841a14e9c6b02df1685 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 31 Dec 2018 17:06:42 -0500 Subject: [PATCH 1/7] bpo-33987: IDLE - use ttk Frame for SearchDialogBase --- Lib/idlelib/idle_test/test_searchbase.py | 3 ++- Lib/idlelib/searchbase.py | 4 ++-- .../NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index 46c3ad111d1793..6376a4dae9c649 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -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 diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py index 348db660e3e912..f0e3d6f14ba49b 100644 --- a/Lib/idlelib/searchbase.py +++ b/Lib/idlelib/searchbase.py @@ -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: 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 index 00000000000000..f5a332aa6e2169 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst @@ -0,0 +1 @@ +Use ttk Frame for SearchDialogBase From 30ce20d7d0bf3605a74a85f9994c6d1e2ba302db Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 31 Dec 2018 18:07:30 -0500 Subject: [PATCH 2/7] Change other modules. --- Lib/idlelib/autocomplete_w.py | 2 +- Lib/idlelib/config_key.py | 2 +- Lib/idlelib/configdialog.py | 2 +- Lib/idlelib/debugger.py | 2 +- Lib/idlelib/grep.py | 10 ++++++---- Lib/idlelib/query.py | 1 - Lib/idlelib/replace.py | 14 ++++++++------ Lib/idlelib/scrolledlist.py | 2 +- Lib/idlelib/search.py | 15 +++++++++------ Lib/idlelib/tree.py | 2 +- 10 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py index 9e0d336523d479..7994bc0db17012 100644 --- a/Lib/idlelib/autocomplete_w.py +++ b/Lib/idlelib/autocomplete_w.py @@ -4,7 +4,7 @@ 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 diff --git a/Lib/idlelib/config_key.py b/Lib/idlelib/config_key.py index 21e84a94c9ff54..4478323fcc2c51 100644 --- a/Lib/idlelib/config_key.py +++ b/Lib/idlelib/config_key.py @@ -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 diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py index 229dc898743322..5fdaf82de4de70 100644 --- a/Lib/idlelib/configdialog.py +++ b/Lib/idlelib/configdialog.py @@ -14,7 +14,7 @@ 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 diff --git a/Lib/idlelib/debugger.py b/Lib/idlelib/debugger.py index 09f912c9af336d..ccd03e46e16147 100644 --- a/Lib/idlelib/debugger.py +++ b/Lib/idlelib/debugger.py @@ -2,7 +2,7 @@ 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 diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py index 8cc293c380dec6..e8f2b2fa568f23 100644 --- a/Lib/idlelib/grep.py +++ b/Lib/idlelib/grep.py @@ -8,7 +8,7 @@ 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,7 +173,7 @@ def findfiles(self, dir, base, rec): 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") @@ -181,7 +181,9 @@ def _grep_dialog(parent): # htest # 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 +191,7 @@ def show_grep_dialog(): 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__": diff --git a/Lib/idlelib/query.py b/Lib/idlelib/query.py index c2628cceb73978..f0b72553db87f7 100644 --- a/Lib/idlelib/query.py +++ b/Lib/idlelib/query.py @@ -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. diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py index 83cf98756bdf81..4a834eb7901e61 100644 --- a/Lib/idlelib/replace.py +++ b/Lib/idlelib/replace.py @@ -205,12 +205,12 @@ def close(self, event=None): 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 undo_block_start(): 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 show_replace(): 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__': diff --git a/Lib/idlelib/scrolledlist.py b/Lib/idlelib/scrolledlist.py index 10229b63629293..71fd18ab19ec8a 100644 --- a/Lib/idlelib/scrolledlist.py +++ b/Lib/idlelib/scrolledlist.py @@ -1,5 +1,5 @@ from tkinter import * -from tkinter.ttk import Scrollbar +from tkinter.ttk import Frame, Scrollbar from idlelib import macosx diff --git a/Lib/idlelib/search.py b/Lib/idlelib/search.py index 6223661c8e080a..6e5a0c7973c728 100644 --- a/Lib/idlelib/search.py +++ b/Lib/idlelib/search.py @@ -75,13 +75,16 @@ def find_selection(self, text): 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 show_find(): _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__': diff --git a/Lib/idlelib/tree.py b/Lib/idlelib/tree.py index 05f864657fb827..09f8edb3397b8c 100644 --- a/Lib/idlelib/tree.py +++ b/Lib/idlelib/tree.py @@ -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 From 78a428e796890f5a568dd19df26c99afaa17de57 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 31 Dec 2018 18:09:03 -0500 Subject: [PATCH 3/7] Update 2018-12-31-17-04-18.bpo-33987.fD92up.rst --- Misc/NEWS.d/next/IDLE/2018-12-31-17-04-18.bpo-33987.fD92up.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index f5a332aa6e2169..289a65cf532cad 100644 --- 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 @@ -1 +1 @@ -Use ttk Frame for SearchDialogBase +Use ttk Frame for ttk widgets. From a03ef07608ae9a3efa0ac5cf6d24879dc56c7099 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 31 Dec 2018 18:12:40 -0500 Subject: [PATCH 4/7] tree.py - remove temporary '#' used to test with tk widgets --- Lib/idlelib/tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/tree.py b/Lib/idlelib/tree.py index 09f8edb3397b8c..21426cbb33e0da 100644 --- a/Lib/idlelib/tree.py +++ b/Lib/idlelib/tree.py @@ -17,7 +17,7 @@ import os from tkinter import * -#from tkinter.ttk import Frame, Scrollbar +from tkinter.ttk import Frame, Scrollbar from idlelib.config import idleConf from idlelib import zoomheight From a8dd9e3609f2eb4253c54440f936057eddb239e3 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Mon, 31 Dec 2018 18:16:56 -0500 Subject: [PATCH 5/7] Update grep.py insert newline --- Lib/idlelib/grep.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py index e8f2b2fa568f23..873233ec15439c 100644 --- a/Lib/idlelib/grep.py +++ b/Lib/idlelib/grep.py @@ -175,6 +175,7 @@ def _grep_dialog(parent): # htest # from tkinter import Toplevel, Text, SEL, END 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:]) From 654856daeea1415b0eb0f2f1ba85a00b1591c8a4 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 2 Jan 2019 18:25:35 -0500 Subject: [PATCH 6/7] Use workaround for test_make_frame. See terryjreedy comment in issue 33987 pr 11395. --- Lib/idlelib/idle_test/test_searchbase.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index 6376a4dae9c649..ce6f490e5e1509 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -98,11 +98,12 @@ def test_make_frame(self): self.dialog.top = self.root frame, label = self.dialog.make_frame() self.assertEqual(label, '') - self.assertIsInstance(frame, Frame) - + self.assertEqual(str(type(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 From e523da93490d95b9171180d3bf6a65a909b491a9 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Wed, 2 Jan 2019 20:32:46 -0500 Subject: [PATCH 7/7] test_searchbase whitespace --- Lib/idlelib/idle_test/test_searchbase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py index ce6f490e5e1509..09a7fff51de1dc 100644 --- a/Lib/idlelib/idle_test/test_searchbase.py +++ b/Lib/idlelib/idle_test/test_searchbase.py @@ -101,7 +101,7 @@ def test_make_frame(self): self.assertEqual(str(type(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')