Issue #27477: Convert IDLE search dialogs to using ttk widgets.
This commit is contained in:
parent
a748032653
commit
6f7b0f577e
|
@ -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:])
|
||||
|
|
|
@ -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': {},
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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:])
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue