[Python-checkins] cpython: Issue *24750: Switch all scrollbars in IDLE to ttk versions.

terry.reedy python-checkins at python.org
Fri Jun 10 18:19:32 EDT 2016


https://hg.python.org/cpython/rev/288e97680d84
changeset: 101859:288e97680d84
user: Terry Jan Reedy <tjreedy at udel.edu>
date: Fri Jun 10 18:19:21 2016 -0400
summary:
 Issue *24750: Switch all scrollbars in IDLE to ttk versions.
Where needed, add minimal tests to cover changes.
files:
 Lib/idlelib/autocomplete_w.py | 1 +
 Lib/idlelib/config_key.py | 21 +++--
 Lib/idlelib/configdialog.py | 1 +
 Lib/idlelib/debugger.py | 1 +
 Lib/idlelib/editor.py | 1 +
 Lib/idlelib/help.py | 22 +++---
 Lib/idlelib/idle_test/htest.py | 3 +-
 Lib/idlelib/idle_test/test_autocomplete.py | 8 +-
 Lib/idlelib/idle_test/test_config_key.py | 31 ++++++++
 Lib/idlelib/idle_test/test_debugger.py | 29 ++++++++
 Lib/idlelib/idle_test/test_help.py | 34 +++++++++
 Lib/idlelib/idle_test/test_scrolledlist.py | 29 ++++++++
 Lib/idlelib/idle_test/test_textview.py | 2 +-
 Lib/idlelib/idle_test/test_tree.py | 36 ++++++++++
 Lib/idlelib/scrolledlist.py | 13 +-
 Lib/idlelib/textview.py | 3 +-
 Lib/idlelib/tree.py | 15 +--
 17 files changed, 211 insertions(+), 39 deletions(-)
diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py
--- a/Lib/idlelib/autocomplete_w.py
+++ b/Lib/idlelib/autocomplete_w.py
@@ -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
 
diff --git a/Lib/idlelib/config_key.py b/Lib/idlelib/config_key.py
--- a/Lib/idlelib/config_key.py
+++ b/Lib/idlelib/config_key.py
@@ -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 @@
 self.advanced = False
 self.CreateWidgets()
 self.LoadFinalKeyList()
- self.withdraw() #hide while setting geometry
 self.update_idletasks()
 self.geometry(
 "+%d+%d" % (
@@ -47,8 +50,9 @@
 ((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 @@
 keysOK = True
 return keysOK
 
+
 if __name__ == '__main__':
 from idlelib.idle_test.htest import run
 run(GetKeysDialog)
diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py
--- a/Lib/idlelib/configdialog.py
+++ b/Lib/idlelib/configdialog.py
@@ -10,6 +10,7 @@
 
 """
 from tkinter import *
+from tkinter.ttk import Scrollbar
 import tkinter.messagebox as tkMessageBox
 import tkinter.colorchooser as tkColorChooser
 import tkinter.font as tkFont
diff --git a/Lib/idlelib/debugger.py b/Lib/idlelib/debugger.py
--- a/Lib/idlelib/debugger.py
+++ b/Lib/idlelib/debugger.py
@@ -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
diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py
--- a/Lib/idlelib/editor.py
+++ b/Lib/idlelib/editor.py
@@ -7,6 +7,7 @@
 import string
 import sys
 from tkinter import *
+from tkinter.ttk import Scrollbar
 import tkinter.simpledialog as tkSimpleDialog
 import tkinter.messagebox as tkMessageBox
 import traceback
diff --git a/Lib/idlelib/help.py b/Lib/idlelib/help.py
--- a/Lib/idlelib/help.py
+++ b/Lib/idlelib/help.py
@@ -26,14 +26,11 @@
 """
 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 @@
 "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 @@
 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
diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py
--- a/Lib/idlelib/idle_test/htest.py
+++ b/Lib/idlelib/idle_test/htest.py
@@ -68,6 +68,7 @@
 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 @@
 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)
diff --git a/Lib/idlelib/idle_test/test_autocomplete.py b/Lib/idlelib/idle_test/test_autocomplete.py
--- a/Lib/idlelib/idle_test/test_autocomplete.py
+++ b/Lib/idlelib/idle_test/test_autocomplete.py
@@ -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 @@
 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)
 
diff --git a/Lib/idlelib/idle_test/test_config_key.py b/Lib/idlelib/idle_test/test_config_key.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_config_key.py
@@ -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)
diff --git a/Lib/idlelib/idle_test/test_debugger.py b/Lib/idlelib/idle_test/test_debugger.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_debugger.py
@@ -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)
diff --git a/Lib/idlelib/idle_test/test_help.py b/Lib/idlelib/idle_test/test_help.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_help.py
@@ -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)
diff --git a/Lib/idlelib/idle_test/test_scrolledlist.py b/Lib/idlelib/idle_test/test_scrolledlist.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_scrolledlist.py
@@ -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)
diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py
--- a/Lib/idlelib/idle_test/test_textview.py
+++ b/Lib/idlelib/idle_test/test_textview.py
@@ -7,13 +7,13 @@
 
 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
 
diff --git a/Lib/idlelib/idle_test/test_tree.py b/Lib/idlelib/idle_test/test_tree.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_tree.py
@@ -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)
diff --git a/Lib/idlelib/scrolledlist.py b/Lib/idlelib/scrolledlist.py
--- a/Lib/idlelib/scrolledlist.py
+++ b/Lib/idlelib/scrolledlist.py
@@ -1,5 +1,6 @@
 from tkinter import *
 from idlelib import macosx
+from tkinter.ttk import Scrollbar
 
 class ScrolledList:
 
@@ -124,22 +125,20 @@
 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)
diff --git a/Lib/idlelib/textview.py b/Lib/idlelib/textview.py
--- a/Lib/idlelib/textview.py
+++ b/Lib/idlelib/textview.py
@@ -3,6 +3,7 @@
 """
 
 from tkinter import *
+from tkinter.ttk import Scrollbar
 import tkinter.messagebox as tkMessageBox
 
 class TextViewer(Toplevel):
@@ -50,7 +51,7 @@
 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)
diff --git a/Lib/idlelib/tree.py b/Lib/idlelib/tree.py
--- a/Lib/idlelib/tree.py
+++ b/Lib/idlelib/tree.py
@@ -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 @@
 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)
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /