summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTerry Jan Reedy <tjreedy@udel.edu>2016-07-10 20:21:31 -0400
committerTerry Jan Reedy <tjreedy@udel.edu>2016-07-10 20:21:31 -0400
commitb50fa3e242d1da3a2e500909b7958eb6fe99fff8 (patch)
tree705696c50ef327cc73fdbbb32c7ce4f44839aeb5
parent5ebfdc9de3428a14a008c8508eebe74c12afca63 (diff)
downloadcpython-b50fa3e242d1da3a2e500909b7958eb6fe99fff8.tar.gz
Issue #27477: Convert IDLE search dialogs to using ttk widgets.
-rw-r--r--Lib/idlelib/grep.py13
-rw-r--r--Lib/idlelib/idle_test/htest.py7
-rw-r--r--Lib/idlelib/idle_test/test_searchbase.py13
-rw-r--r--Lib/idlelib/replace.py6
-rw-r--r--Lib/idlelib/search.py11
-rw-r--r--Lib/idlelib/searchbase.py36
6 files changed, 50 insertions, 36 deletions
diff --git a/Lib/idlelib/grep.py b/Lib/idlelib/grep.py
index f1382c9d65..cfb0ea0ad8 100644
--- a/Lib/idlelib/grep.py
+++ b/Lib/idlelib/grep.py
@@ -1,7 +1,8 @@
import os
import fnmatch
import sys
-from tkinter import StringVar, BooleanVar, Checkbutton # for GrepDialog
+from tkinter import StringVar, BooleanVar
+from tkinter.ttk import Checkbutton
from idlelib import searchengine
from idlelib.searchbase import SearchDialogBase
# Importing OutputWindow fails due to import loop
@@ -45,13 +46,10 @@ class GrepDialog(SearchDialogBase):
self.globent = self.make_entry("In files:", self.globvar)[0]
def create_other_buttons(self):
- f = self.make_frame()[0]
-
- btn = Checkbutton(f, anchor="w",
- variable=self.recvar,
+ btn = Checkbutton(
+ self.make_frame()[0], variable=self.recvar,
text="Recurse down subdirectories")
btn.pack(side="top", fill="both")
- btn.select()
def create_command_buttons(self):
SearchDialogBase.create_command_buttons(self)
@@ -130,7 +128,8 @@ class GrepDialog(SearchDialogBase):
def _grep_dialog(parent): # htest #
from idlelib.pyshell import PyShellFileList
- from tkinter import Toplevel, Text, Button, SEL, END
+ from tkinter import Toplevel, Text, SEL, END
+ from tkinter.ttk import Button
top = Toplevel(parent)
top.title("Test GrepDialog")
x, y = map(int, parent.geometry().split('+')[1:])
diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py
index f5311e966c..4d98924d9b 100644
--- a/Lib/idlelib/idle_test/htest.py
+++ b/Lib/idlelib/idle_test/htest.py
@@ -265,6 +265,13 @@ _search_dialog_spec = {
"Click [Close] or [X] to close the 'Search Dialog'."
}
+_searchbase_spec = {
+ 'file': 'searchbase',
+ 'kwds': {},
+ 'msg': "Check the appearance of the base search dialog\n"
+ "Its only action is to close."
+ }
+
_scrolled_list_spec = {
'file': 'scrolledlist',
'kwds': {},
diff --git a/Lib/idlelib/idle_test/test_searchbase.py b/Lib/idlelib/idle_test/test_searchbase.py
index a0b1231ecd..d769fa2fc2 100644
--- a/Lib/idlelib/idle_test/test_searchbase.py
+++ b/Lib/idlelib/idle_test/test_searchbase.py
@@ -1,8 +1,7 @@
-'''Unittests for idlelib/searchbase.py
+'''tests idlelib.searchbase.
Coverage: 99%. The only thing not covered is inconsequential --
testing skipping of suite when self.needwrapbutton is false.
-
'''
import unittest
from test.support import requires
@@ -120,11 +119,6 @@ class SearchDialogBaseTest(unittest.TestCase):
var, label = spec
self.assertEqual(button['text'], label)
self.assertEqual(var.get(), state)
- if state == 1:
- button.deselect()
- else:
- button.select()
- self.assertEqual(var.get(), 1 - state)
def test_create_other_buttons(self):
for state in (False, True):
@@ -140,10 +134,6 @@ class SearchDialogBaseTest(unittest.TestCase):
# hit other button, then this one
# indexes depend on button order
self.assertEqual(var.get(), state)
- buttons[val].select()
- self.assertEqual(var.get(), 1 - state)
- buttons[1-val].select()
- self.assertEqual(var.get(), state)
def test_make_button(self):
self.dialog.top = self.root
@@ -162,6 +152,5 @@ class SearchDialogBaseTest(unittest.TestCase):
self.assertIn('close', closebuttoncommand)
-
if __name__ == '__main__':
unittest.main(verbosity=2, exit=2)
diff --git a/Lib/idlelib/replace.py b/Lib/idlelib/replace.py
index a0acd41ed2..7c9573330f 100644
--- a/Lib/idlelib/replace.py
+++ b/Lib/idlelib/replace.py
@@ -3,7 +3,7 @@ Uses idlelib.SearchEngine for search capability.
Defines various replace related functions like replace, replace all,
replace+find.
"""
-from tkinter import *
+from tkinter import StringVar, TclError
from idlelib import searchengine
from idlelib.searchbase import SearchDialogBase
@@ -204,7 +204,9 @@ class ReplaceDialog(SearchDialogBase):
def _replace_dialog(parent): # htest #
- """htest wrapper function"""
+ from tkinter import Toplevel, Text
+ from tkiter.ttk import Button
+
box = Toplevel(parent)
box.title("Test ReplaceDialog")
x, y = map(int, parent.geometry().split('+')[1:])
diff --git a/Lib/idlelib/search.py b/Lib/idlelib/search.py
index 17a9ef3651..4c2acef7b0 100644
--- a/Lib/idlelib/search.py
+++ b/Lib/idlelib/search.py
@@ -1,4 +1,4 @@
-from tkinter import *
+from tkinter import TclError
from idlelib import searchengine
from idlelib.searchbase import SearchDialogBase
@@ -72,7 +72,10 @@ class SearchDialog(SearchDialogBase):
def _search_dialog(parent): # htest #
- '''Display search test box.'''
+ "Display search test box."
+ from tkinter import Toplevel, Text
+ from tkinter.ttk import Button
+
box = Toplevel(parent)
box.title("Test SearchDialog")
x, y = map(int, parent.geometry().split('+')[1:])
@@ -82,9 +85,9 @@ def _search_dialog(parent): # htest #
text.insert("insert","This is a sample string.\n"*5)
def show_find():
- text.tag_add(SEL, "1.0", END)
+ text.tag_add('sel', '1.0', 'end')
_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.pack()
diff --git a/Lib/idlelib/searchbase.py b/Lib/idlelib/searchbase.py
index 9206bf5051..cfb40520e7 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, Entry, Label, Button,
- Checkbutton, Radiobutton)
+from tkinter import Toplevel, Frame
+from tkinter.ttk import Entry, Label, Button, Checkbutton, Radiobutton
class SearchDialogBase:
'''Create most of a 3 or 4 row, 3 column search dialog.
@@ -137,10 +137,8 @@ class SearchDialogBase:
if self.needwrapbutton:
options.append((engine.wrapvar, "Wrap around"))
for var, label in options:
- btn = Checkbutton(frame, anchor="w", variable=var, text=label)
+ btn = Checkbutton(frame, variable=var, text=label)
btn.pack(side="left", fill="both")
- if var.get():
- btn.select()
return frame, options
def create_other_buttons(self):
@@ -153,11 +151,8 @@ class SearchDialogBase:
var = self.engine.backvar
others = [(1, 'Up'), (0, 'Down')]
for val, label in others:
- btn = Radiobutton(frame, anchor="w",
- variable=var, value=val, text=label)
+ btn = Radiobutton(frame, variable=var, value=val, text=label)
btn.pack(side="left", fill="both")
- if var.get() == val:
- btn.select()
return frame, others
def make_button(self, label, command, isdef=0):
@@ -178,7 +173,26 @@ class SearchDialogBase:
b = self.make_button("close", self.close)
b.lower()
+
+class _searchbase(SearchDialogBase): # htest #
+ "Create auto-opening dialog with no text connection."
+
+ def __init__(self, parent):
+ import re
+ from idlelib import searchengine
+
+ self.root = parent
+ self.engine = searchengine.get(parent)
+ self.create_widgets()
+ print(parent.geometry())
+ width,height, x,y = list(map(int, re.split('[x+]', parent.geometry())))
+ self.top.geometry("+%d+%d" % (x + 40, y + 175))
+
+ def default_command(self): pass
+
if __name__ == '__main__':
import unittest
- unittest.main(
- 'idlelib.idle_test.test_searchdialogbase', verbosity=2)
+ unittest.main('idlelib.idle_test.test_searchbase', verbosity=2, exit=False)
+
+ from idlelib.idle_test.htest import run
+ run(_searchbase)