Commit aff0adab authored by Terry Jan Reedy's avatar Terry Jan Reedy Committed by GitHub

bpo-33987: IDLE - use ttk Frame for ttk widgets (GH-11395)

parent e9a044ec
...@@ -4,7 +4,7 @@ An auto-completion window for IDLE, used by the autocomplete extension ...@@ -4,7 +4,7 @@ An auto-completion window for IDLE, used by the autocomplete extension
import platform import platform
from tkinter import * from tkinter import *
from tkinter.ttk import Scrollbar from tkinter.ttk import Frame, Scrollbar
from idlelib.autocomplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES from idlelib.autocomplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES
from idlelib.multicall import MC_SHIFT from idlelib.multicall import MC_SHIFT
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Dialog for building Tkinter accelerator key bindings Dialog for building Tkinter accelerator key bindings
""" """
from tkinter import Toplevel, Listbox, Text, StringVar, TclError 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 from tkinter import messagebox
import string import string
import sys import sys
......
...@@ -14,7 +14,7 @@ from tkinter import (Toplevel, Listbox, Text, Scale, Canvas, ...@@ -14,7 +14,7 @@ from tkinter import (Toplevel, Listbox, Text, Scale, Canvas,
TOP, BOTTOM, RIGHT, LEFT, SOLID, GROOVE, TOP, BOTTOM, RIGHT, LEFT, SOLID, GROOVE,
NONE, BOTH, X, Y, W, E, EW, NS, NSEW, NW, NONE, BOTH, X, Y, W, E, EW, NS, NSEW, NW,
HORIZONTAL, VERTICAL, ANCHOR, ACTIVE, END) 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) OptionMenu, Notebook, Radiobutton, Scrollbar, Style)
import tkinter.colorchooser as tkColorChooser import tkinter.colorchooser as tkColorChooser
import tkinter.font as tkFont import tkinter.font as tkFont
......
...@@ -2,7 +2,7 @@ import bdb ...@@ -2,7 +2,7 @@ import bdb
import os import os
from tkinter import * from tkinter import *
from tkinter.ttk import Scrollbar from tkinter.ttk import Frame, Scrollbar
from idlelib import macosx from idlelib import macosx
from idlelib.scrolledlist import ScrolledList from idlelib.scrolledlist import ScrolledList
......
...@@ -8,7 +8,7 @@ import os ...@@ -8,7 +8,7 @@ import os
import sys import sys
from tkinter import StringVar, BooleanVar 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.searchbase import SearchDialogBase
from idlelib import searchengine from idlelib import searchengine
...@@ -173,15 +173,18 @@ class GrepDialog(SearchDialogBase): ...@@ -173,15 +173,18 @@ class GrepDialog(SearchDialogBase):
def _grep_dialog(parent): # htest # def _grep_dialog(parent): # htest #
from tkinter import Toplevel, Text, SEL, END from tkinter import Toplevel, Text, SEL, END
from tkinter.ttk import Button from tkinter.ttk import Frame, Button
from idlelib.pyshell import PyShellFileList from idlelib.pyshell import PyShellFileList
top = Toplevel(parent) top = Toplevel(parent)
top.title("Test GrepDialog") top.title("Test GrepDialog")
x, y = map(int, parent.geometry().split('+')[1:]) x, y = map(int, parent.geometry().split('+')[1:])
top.geometry(f"+{x}+{y + 175}") top.geometry(f"+{x}+{y + 175}")
flist = PyShellFileList(top) flist = PyShellFileList(top)
text = Text(top, height=5) frame = Frame(top)
frame.pack()
text = Text(frame, height=5)
text.pack() text.pack()
def show_grep_dialog(): def show_grep_dialog():
...@@ -189,7 +192,7 @@ def _grep_dialog(parent): # htest # ...@@ -189,7 +192,7 @@ def _grep_dialog(parent): # htest #
grep(text, flist=flist) grep(text, flist=flist)
text.tag_remove(SEL, "1.0", END) 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() button.pack()
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
import unittest import unittest
from test.support import requires 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 searchengine as se
from idlelib import searchbase as sdb from idlelib import searchbase as sdb
from idlelib.idle_test.mock_idle import Func from idlelib.idle_test.mock_idle import Func
...@@ -97,11 +98,12 @@ class SearchDialogBaseTest(unittest.TestCase): ...@@ -97,11 +98,12 @@ class SearchDialogBaseTest(unittest.TestCase):
self.dialog.top = self.root self.dialog.top = self.root
frame, label = self.dialog.make_frame() frame, label = self.dialog.make_frame()
self.assertEqual(label, '') 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') frame, label = self.dialog.make_frame('testlabel')
self.assertEqual(label['text'], 'testlabel') self.assertEqual(label['text'], 'testlabel')
self.assertIsInstance(frame, Frame)
def btn_test_setup(self, meth): def btn_test_setup(self, meth):
self.dialog.top = self.root self.dialog.top = self.root
......
""" """
Dialogs that query users and verify the answer before accepting. 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. Query is the generic base class for a popup dialog.
The user must either enter a valid answer or close the dialog. The user must either enter a valid answer or close the dialog.
......
...@@ -205,12 +205,12 @@ class ReplaceDialog(SearchDialogBase): ...@@ -205,12 +205,12 @@ class ReplaceDialog(SearchDialogBase):
def _replace_dialog(parent): # htest # def _replace_dialog(parent): # htest #
from tkinter import Toplevel, Text, END, SEL from tkinter import Toplevel, Text, END, SEL
from tkinter.ttk import Button from tkinter.ttk import Frame, Button
box = Toplevel(parent) top = Toplevel(parent)
box.title("Test ReplaceDialog") top.title("Test ReplaceDialog")
x, y = map(int, parent.geometry().split('+')[1:]) 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 # mock undo delegator methods
def undo_block_start(): def undo_block_start():
...@@ -219,7 +219,9 @@ def _replace_dialog(parent): # htest # ...@@ -219,7 +219,9 @@ def _replace_dialog(parent): # htest #
def undo_block_stop(): def undo_block_stop():
pass 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_start = undo_block_start
text.undo_block_stop = undo_block_stop text.undo_block_stop = undo_block_stop
text.pack() text.pack()
...@@ -231,7 +233,7 @@ def _replace_dialog(parent): # htest # ...@@ -231,7 +233,7 @@ def _replace_dialog(parent): # htest #
replace(text) replace(text)
text.tag_remove(SEL, "1.0", END) 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() button.pack()
if __name__ == '__main__': if __name__ == '__main__':
......
from tkinter import * from tkinter import *
from tkinter.ttk import Scrollbar from tkinter.ttk import Frame, Scrollbar
from idlelib import macosx from idlelib import macosx
......
...@@ -75,13 +75,16 @@ class SearchDialog(SearchDialogBase): ...@@ -75,13 +75,16 @@ class SearchDialog(SearchDialogBase):
def _search_dialog(parent): # htest # def _search_dialog(parent): # htest #
"Display search test box." "Display search test box."
from tkinter import Toplevel, Text from tkinter import Toplevel, Text
from tkinter.ttk import Button from tkinter.ttk import Frame, Button
box = Toplevel(parent) top = Toplevel(parent)
box.title("Test SearchDialog") top.title("Test SearchDialog")
x, y = map(int, parent.geometry().split('+')[1:]) x, y = map(int, parent.geometry().split('+')[1:])
box.geometry("+%d+%d" % (x, y + 175)) top.geometry("+%d+%d" % (x, y + 175))
text = Text(box, inactiveselectbackground='gray')
frame = Frame(top)
frame.pack()
text = Text(frame, inactiveselectbackground='gray')
text.pack() text.pack()
text.insert("insert","This is a sample string.\n"*5) text.insert("insert","This is a sample string.\n"*5)
...@@ -90,7 +93,7 @@ def _search_dialog(parent): # htest # ...@@ -90,7 +93,7 @@ def _search_dialog(parent): # htest #
_setup(text).open(text) _setup(text).open(text)
text.tag_remove('sel', '1.0', 'end') 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() button.pack()
if __name__ == '__main__': if __name__ == '__main__':
......
'''Define SearchDialogBase used by Search, Replace, and Grep dialogs.''' '''Define SearchDialogBase used by Search, Replace, and Grep dialogs.'''
from tkinter import Toplevel, Frame from tkinter import Toplevel
from tkinter.ttk import Entry, Label, Button, Checkbutton, Radiobutton from tkinter.ttk import Frame, Entry, Label, Button, Checkbutton, Radiobutton
class SearchDialogBase: class SearchDialogBase:
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
import os import os
from tkinter import * from tkinter import *
from tkinter.ttk import Scrollbar from tkinter.ttk import Frame, Scrollbar
from idlelib.config import idleConf from idlelib.config import idleConf
from idlelib import zoomheight from idlelib import zoomheight
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment