Issue *24750: Switch all scrollbars in IDLE to ttk versions.

Where needed, add minimal tests to cover changes.
This commit is contained in:
Terry Jan Reedy 2016-06-10 18:19:21 -04:00
parent 96881cd621
commit 01e35754fb
17 changed files with 211 additions and 39 deletions

View File

@ -2,6 +2,7 @@
An auto-completion window for IDLE, used by the autocomplete extension
"""
from tkinter import *
from tkinter.ttk import Scrollbar
from idlelib.multicall import MC_SHIFT
from idlelib.autocomplete import COMPLETE_FILES, COMPLETE_ATTRIBUTES

View File

@ -2,31 +2,35 @@
Dialog for building Tkinter accelerator key bindings
"""
from tkinter import *
from tkinter.ttk import Scrollbar
import tkinter.messagebox as tkMessageBox
import string
import sys
class GetKeysDialog(Toplevel):
def __init__(self,parent,title,action,currentKeySequences,_htest=False):
def __init__(self, parent, title, action, currentKeySequences,
_htest=False, _utest=False):
"""
action - string, the name of the virtual event these keys will be
mapped to
currentKeys - list, a list of all key sequence lists currently mapped
to virtual events, for overlap checking
_utest - bool, do not wait when running unittest
_htest - bool, change box location when running htest
"""
Toplevel.__init__(self, parent)
self.withdraw() #hide while setting geometry
self.configure(borderwidth=5)
self.resizable(height=FALSE,width=FALSE)
self.resizable(height=FALSE, width=FALSE)
self.title(title)
self.transient(parent)
self.grab_set()
self.protocol("WM_DELETE_WINDOW", self.Cancel)
self.parent = parent
self.action=action
self.currentKeySequences=currentKeySequences
self.result=''
self.keyString=StringVar(self)
self.currentKeySequences = currentKeySequences
self.result = ''
self.keyString = StringVar(self)
self.keyString.set('')
self.SetModifiersForPlatform() # set self.modifiers, self.modifier_label
self.modifier_vars = []
@ -37,7 +41,6 @@ class GetKeysDialog(Toplevel):
self.advanced = False
self.CreateWidgets()
self.LoadFinalKeyList()
self.withdraw() #hide while setting geometry
self.update_idletasks()
self.geometry(
"+%d+%d" % (
@ -47,8 +50,9 @@ class GetKeysDialog(Toplevel):
((parent.winfo_height()/2 - self.winfo_reqheight()/2)
if not _htest else 150)
) ) #centre dialog over parent (or below htest box)
self.deiconify() #geometry set, unhide
self.wait_window()
if not _utest:
self.deiconify() #geometry set, unhide
self.wait_window()
def CreateWidgets(self):
frameMain = Frame(self,borderwidth=2,relief=SUNKEN)
@ -261,6 +265,7 @@ class GetKeysDialog(Toplevel):
keysOK = True
return keysOK
if __name__ == '__main__':
from idlelib.idle_test.htest import run
run(GetKeysDialog)

View File

@ -10,6 +10,7 @@ Refer to comments in EditorWindow autoindent code for details.
"""
from tkinter import *
from tkinter.ttk import Scrollbar
import tkinter.messagebox as tkMessageBox
import tkinter.colorchooser as tkColorChooser
import tkinter.font as tkFont

View File

@ -1,6 +1,7 @@
import os
import bdb
from tkinter import *
from tkinter.ttk import Scrollbar
from idlelib.windows import ListedToplevel
from idlelib.scrolledlist import ScrolledList
from idlelib import macosx

View File

@ -7,6 +7,7 @@ import re
import string
import sys
from tkinter import *
from tkinter.ttk import Scrollbar
import tkinter.simpledialog as tkSimpleDialog
import tkinter.messagebox as tkMessageBox
import traceback

View File

@ -26,14 +26,11 @@ show_idlehelp - Create HelpWindow. Called in EditorWindow.help_dialog.
"""
from html.parser import HTMLParser
from os.path import abspath, dirname, isfile, join
from tkinter import Toplevel, Frame, Text, Scrollbar, Menu, Menubutton
from tkinter import Toplevel, Frame, Text, Menu
from tkinter.ttk import Menubutton, Scrollbar
from tkinter import font as tkfont
from idlelib.config import idleConf
use_ttk = False # until available to import
if use_ttk:
from tkinter.ttk import Menubutton
## About IDLE ##
@ -196,15 +193,18 @@ class HelpFrame(Frame):
"Display html text, scrollbar, and toc."
def __init__(self, parent, filename):
Frame.__init__(self, parent)
text = HelpText(self, filename)
# keep references to widgets for test access.
self.text = text = HelpText(self, filename)
self['background'] = text['background']
scroll = Scrollbar(self, command=text.yview)
self.toc = toc = self.toc_menu(text)
self.scroll = scroll = Scrollbar(self, command=text.yview)
text['yscrollcommand'] = scroll.set
self.rowconfigure(0, weight=1)
self.columnconfigure(1, weight=1) # text
self.toc_menu(text).grid(column=0, row=0, sticky='nw')
text.grid(column=1, row=0, sticky='nsew')
scroll.grid(column=2, row=0, sticky='ns')
toc.grid(row=0, column=0, sticky='nw')
text.grid(row=0, column=1, sticky='nsew')
scroll.grid(row=0, column=2, sticky='ns')
def toc_menu(self, text):
"Create table of contents as drop-down menu."
@ -265,7 +265,7 @@ def show_idlehelp(parent):
if not isfile(filename):
# try copy_strip, present message
return
HelpWindow(parent, filename, 'IDLE Help')
return HelpWindow(parent, filename, 'IDLE Help')
if __name__ == '__main__':
from idlelib.idle_test.htest import run

View File

@ -68,6 +68,7 @@ outwin.OutputWindow (indirectly being tested with grep test)
from importlib import import_module
from idlelib.macosx import _init_tk_type
import tkinter as tk
from tkinter.ttk import Scrollbar
AboutDialog_spec = {
'file': 'help_about',
@ -344,7 +345,7 @@ def run(*tests):
frameLabel.pack()
text = tk.Text(frameLabel, wrap='word')
text.configure(bg=root.cget('bg'), relief='flat', height=4, width=70)
scrollbar = tk.Scrollbar(frameLabel, command=text.yview)
scrollbar = Scrollbar(frameLabel, command=text.yview)
text.config(yscrollcommand=scrollbar.set)
scrollbar.pack(side='right', fill='y', expand=False)
text.pack(side='left', fill='both', expand=True)

View File

@ -1,10 +1,14 @@
''' Test autocomplete and autocomple_w
Coverage of autocomple: 56%
'''
import unittest
from test.support import requires
from tkinter import Tk, Text
import idlelib.autocomplete as ac
import idlelib.autocomplete_w as acw
import idlelib.macosx as mac
from idlelib import macosx
from idlelib.idle_test.mock_idle import Func
from idlelib.idle_test.mock_tk import Event
@ -27,7 +31,7 @@ class AutoCompleteTest(unittest.TestCase):
def setUpClass(cls):
requires('gui')
cls.root = Tk()
mac.setupApp(cls.root, None)
macosx.setupApp(cls.root, None)
cls.text = Text(cls.root)
cls.editor = DummyEditwin(cls.root, cls.text)

View File

@ -0,0 +1,31 @@
''' Test idlelib.config_key.
Coverage: 56%
'''
from idlelib import config_key
from test.support import requires
requires('gui')
import unittest
from tkinter import Tk, Text
class GetKeysTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.root = Tk()
@classmethod
def tearDownClass(cls):
cls.root.destroy()
del cls.root
def test_init(self):
dia = config_key.GetKeysDialog(
self.root, 'test', '<<Test>>', ['<Key-F12>'], _utest=True)
dia.Cancel()
if __name__ == '__main__':
unittest.main(verbosity=2)

View File

@ -0,0 +1,29 @@
''' Test idlelib.debugger.
Coverage: 19%
'''
from idlelib import debugger
from test.support import requires
requires('gui')
import unittest
from tkinter import Tk
class NameSpaceTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.root = Tk()
cls.root.withdraw()
@classmethod
def tearDownClass(cls):
cls.root.destroy()
del cls.root
def test_init(self):
debugger.NamespaceViewer(self.root, 'Test')
if __name__ == '__main__':
unittest.main(verbosity=2)

View File

@ -0,0 +1,34 @@
'''Test idlelib.help.
Coverage: 87%
'''
from idlelib import help
from test.support import requires
requires('gui')
from os.path import abspath, dirname, join
from tkinter import Tk
import unittest
class HelpFrameTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
"By itself, this tests that file parsed without exception."
cls.root = root = Tk()
root.withdraw()
helpfile = join(abspath(dirname(dirname(__file__))), 'help.html')
cls.frame = help.HelpFrame(root, helpfile)
@classmethod
def tearDownClass(cls):
del cls.frame
cls.root.update_idletasks()
cls.root.destroy()
del cls.root
def test_line1(self):
text = self.frame.text
self.assertEqual(text.get('1.0', '1.end'), ' IDLE ')
if __name__ == '__main__':
unittest.main(verbosity=2)

View File

@ -0,0 +1,29 @@
''' Test idlelib.scrolledlist.
Coverage: 39%
'''
from idlelib import scrolledlist
from test.support import requires
requires('gui')
import unittest
from tkinter import Tk
class ScrolledListTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.root = Tk()
@classmethod
def tearDownClass(cls):
cls.root.destroy()
del cls.root
def test_init(self):
scrolledlist.ScrolledList(self.root)
if __name__ == '__main__':
unittest.main(verbosity=2)

View File

@ -7,13 +7,13 @@ information about calls.
The coverage is essentially 100%.
'''
from idlelib import textview as tv
from test.support import requires
requires('gui')
import unittest
import os
from tkinter import Tk
from idlelib import textview as tv
from idlelib.idle_test.mock_idle import Func
from idlelib.idle_test.mock_tk import Mbox

View File

@ -0,0 +1,36 @@
''' Test idlelib.tree.
Coverage: 56%
'''
from idlelib import tree
from test.support import requires
requires('gui')
import os
import unittest
from tkinter import Tk
class TreeTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.root = Tk()
cls.root.withdraw()
@classmethod
def tearDownClass(cls):
cls.root.destroy()
del cls.root
def test_init(self):
# Start with code slightly adapted from htest.
sc = tree.ScrolledCanvas(
self.root, bg="white", highlightthickness=0, takefocus=1)
sc.frame.pack(expand=1, fill="both", side='left')
item = tree.FileTreeItem(tree.ICONDIR)
node = tree.TreeNode(sc.canvas, None, item)
node.expand()
if __name__ == '__main__':
unittest.main(verbosity=2)

View File

@ -1,5 +1,6 @@
from tkinter import *
from idlelib import macosx
from tkinter.ttk import Scrollbar
class ScrolledList:
@ -124,22 +125,20 @@ class ScrolledList:
pass
def _scrolled_list(parent):
root = Tk()
root.title("Test ScrolledList")
def _scrolled_list(parent): # htest #
top = Toplevel(parent)
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
top.geometry("+%d+%d"%(x+200, y + 175))
class MyScrolledList(ScrolledList):
def fill_menu(self): self.menu.add_command(label="right click")
def on_select(self, index): print("select", self.get(index))
def on_double(self, index): print("double", self.get(index))
scrolled_list = MyScrolledList(root)
scrolled_list = MyScrolledList(top)
for i in range(30):
scrolled_list.append("Item %02d" % i)
root.mainloop()
if __name__ == '__main__':
# At the moment, test_scrolledlist merely creates instance, like htest.
from idlelib.idle_test.htest import run
run(_scrolled_list)

View File

@ -3,6 +3,7 @@
"""
from tkinter import *
from tkinter.ttk import Scrollbar
import tkinter.messagebox as tkMessageBox
class TextViewer(Toplevel):
@ -50,7 +51,7 @@ class TextViewer(Toplevel):
self.buttonOk = Button(frameButtons, text='Close',
command=self.Ok, takefocus=FALSE)
self.scrollbarView = Scrollbar(frameText, orient=VERTICAL,
takefocus=FALSE, highlightthickness=0)
takefocus=FALSE)
self.textView = Text(frameText, wrap=WORD, highlightthickness=0,
fg=self.fg, bg=self.bg)
self.scrollbarView.config(command=self.textView.yview)

View File

@ -16,7 +16,7 @@
import os
from tkinter import *
from tkinter.ttk import Scrollbar
from idlelib import zoomheight
from idlelib.config import idleConf
@ -449,18 +449,17 @@ class ScrolledCanvas:
return "break"
def _tree_widget(parent):
root = Tk()
root.title("Test TreeWidget")
def _tree_widget(parent): # htest #
top = Toplevel(parent)
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
top.geometry("+%d+%d"%(x+50, y+175))
sc = ScrolledCanvas(top, bg="white", highlightthickness=0, takefocus=1)
sc.frame.pack(expand=1, fill="both", side=LEFT)
item = FileTreeItem(os.getcwd())
item = FileTreeItem(ICONDIR)
node = TreeNode(sc.canvas, None, item)
node.expand()
root.mainloop()
if __name__ == '__main__':
# test_tree is currently a copy of this
from idlelib.idle_test.htest import run
run(_tree_widget)