Issue #27477: Convert IDLE search dialogs to using ttk widgets.

This commit is contained in:
Terry Jan Reedy 2016-07-10 20:21:31 -04:00
parent a748032653
commit 6f7b0f577e
6 changed files with 50 additions and 36 deletions

View file

@ -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 @@ def create_entries(self):
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 @@ def close(self, event=None):
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:])

View file

@ -265,6 +265,13 @@ def _wrapper(parent): # htest #
"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': {},

View file

@ -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 @@ def test_create_option_buttons(self):
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 @@ def test_create_other_buttons(self):
# 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 @@ def test_create_command_buttons(self):
self.assertIn('close', closebuttoncommand)
if __name__ == '__main__':
unittest.main(verbosity=2, exit=2)

View file

@ -3,7 +3,7 @@
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 @@ def close(self, event=None):
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:])

View file

@ -1,4 +1,4 @@
from tkinter import *
from tkinter import TclError
from idlelib import searchengine
from idlelib.searchbase import SearchDialogBase
@ -72,7 +72,10 @@ def find_selection(self, text):
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()

View file

@ -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 @@ def create_option_buttons(self):
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 @@ def create_other_buttons(self):
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 @@ def create_command_buttons(self):
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)