Merge with 3.4

This commit is contained in:
Terry Jan Reedy 2014-05-24 18:48:45 -04:00
commit e84d26c61b
18 changed files with 412 additions and 179 deletions

View File

@ -133,37 +133,36 @@ def is_active(self):
return bool(self.tipwindow) return bool(self.tipwindow)
def _calltip_window(parent):
root = Tk()
root.title("Test calltips")
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
############################### class MyEditWin: # comparenceptually an editor_window
# def __init__(self):
# Test Code text = self.text = Text(root)
# text.pack(side=LEFT, fill=BOTH, expand=1)
class container: # Conceptually an editor_window text.insert("insert", "string.split")
def __init__(self): root.update()
root = Tk() self.calltip = CallTip(text)
text = self.text = Text(root)
text.pack(side=LEFT, fill=BOTH, expand=1)
text.insert("insert", "string.split")
root.update()
self.calltip = CallTip(text)
text.event_add("<<calltip-show>>", "(") text.event_add("<<calltip-show>>", "(")
text.event_add("<<calltip-hide>>", ")") text.event_add("<<calltip-hide>>", ")")
text.bind("<<calltip-show>>", self.calltip_show) text.bind("<<calltip-show>>", self.calltip_show)
text.bind("<<calltip-hide>>", self.calltip_hide) text.bind("<<calltip-hide>>", self.calltip_hide)
text.focus_set() text.focus_set()
root.mainloop() root.mainloop()
def calltip_show(self, event): def calltip_show(self, event):
self.calltip.showtip("Hello world") self.calltip.showtip("Hello world", "insert", "end")
def calltip_hide(self, event): def calltip_hide(self, event):
self.calltip.hidetip() self.calltip.hidetip()
def main(): editwin = MyEditWin()
# Test code
c=container()
if __name__=='__main__': if __name__=='__main__':
main() from idlelib.idle_test.htest import run
run(_calltip_window)

View File

@ -13,6 +13,7 @@
import os import os
import sys import sys
import pyclbr import pyclbr
import re
from idlelib import PyShell from idlelib import PyShell
from idlelib.WindowList import ListedToplevel from idlelib.WindowList import ListedToplevel
@ -21,11 +22,15 @@
class ClassBrowser: class ClassBrowser:
def __init__(self, flist, name, path): def __init__(self, flist, name, path, _htest=False):
# XXX This API should change, if the file doesn't end in ".py" # XXX This API should change, if the file doesn't end in ".py"
# XXX the code here is bogus! # XXX the code here is bogus!
"""
_htest - bool, change box when location running htest.
"""
self.name = name self.name = name
self.file = os.path.join(path[0], self.name + ".py") self.file = os.path.join(path[0], self.name + ".py")
self._htest = _htest
self.init(flist) self.init(flist)
def close(self, event=None): def close(self, event=None):
@ -40,6 +45,9 @@ def init(self, flist):
self.top = top = ListedToplevel(flist.root) self.top = top = ListedToplevel(flist.root)
top.protocol("WM_DELETE_WINDOW", self.close) top.protocol("WM_DELETE_WINDOW", self.close)
top.bind("<Escape>", self.close) top.bind("<Escape>", self.close)
if self._htest: # place dialog below parent if running htest
top.geometry("+%d+%d" %
(flist.root.winfo_rootx(), flist.root.winfo_rooty() + 200))
self.settitle() self.settitle()
top.focus_set() top.focus_set()
# create scrolled canvas # create scrolled canvas
@ -202,7 +210,7 @@ def OnDoubleClick(self):
edit = PyShell.flist.open(self.file) edit = PyShell.flist.open(self.file)
edit.gotoline(self.cl.methods[self.name]) edit.gotoline(self.cl.methods[self.name])
def main(): def _class_browser(parent): #Wrapper for htest
try: try:
file = __file__ file = __file__
except NameError: except NameError:
@ -213,9 +221,9 @@ def main():
file = sys.argv[0] file = sys.argv[0]
dir, file = os.path.split(file) dir, file = os.path.split(file)
name = os.path.splitext(file)[0] name = os.path.splitext(file)[0]
ClassBrowser(PyShell.flist, name, [dir]) flist = PyShell.PyShellFileList(parent)
if sys.stdin is sys.__stdin__: ClassBrowser(flist, name, [dir], _htest=True)
mainloop()
if __name__ == "__main__": if __name__ == "__main__":
main() from idlelib.idle_test.htest import run
run(_class_browser)

View File

@ -253,17 +253,23 @@ def removecolors(self):
for tag in self.tagdefs: for tag in self.tagdefs:
self.tag_remove(tag, "1.0", "end") self.tag_remove(tag, "1.0", "end")
def main(): def _color_delegator(parent):
from idlelib.Percolator import Percolator from idlelib.Percolator import Percolator
root = Tk() root = Tk()
root.wm_protocol("WM_DELETE_WINDOW", root.quit) root.title("Test ColorDelegator")
text = Text(background="white") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
with open(__file__, 'r') as f:
source = f.read()
text = Text(root, background="white")
# insert only a sample portion
text.insert("insert", source[:690])
text.pack(expand=1, fill="both") text.pack(expand=1, fill="both")
text.focus_set()
p = Percolator(text) p = Percolator(text)
d = ColorDelegator() d = ColorDelegator()
p.insertfilter(d) p.insertfilter(d)
root.mainloop() root.mainloop()
if __name__ == "__main__": if __name__ == "__main__":
main() from idlelib.idle_test.htest import run
run(_color_delegator)

View File

@ -525,16 +525,17 @@ def updaterecentfileslist(self,filename):
if self.editwin.flist: if self.editwin.flist:
self.editwin.update_recent_files_list(filename) self.editwin.update_recent_files_list(filename)
def test(): def _io_binding(parent):
root = Tk() root = Tk()
root.title("Test IOBinding")
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
class MyEditWin: class MyEditWin:
def __init__(self, text): def __init__(self, text):
self.text = text self.text = text
self.flist = None self.flist = None
self.text.bind("<Control-o>", self.open) self.text.bind("<Control-o>", self.open)
self.text.bind("<Control-s>", self.save) self.text.bind("<Control-s>", self.save)
self.text.bind("<Alt-s>", self.save_as)
self.text.bind("<Alt-z>", self.save_a_copy)
def get_saved(self): return 0 def get_saved(self): return 0
def set_saved(self, flag): pass def set_saved(self, flag): pass
def reset_undo(self): pass def reset_undo(self): pass
@ -542,16 +543,13 @@ def open(self, event):
self.text.event_generate("<<open-window-from-file>>") self.text.event_generate("<<open-window-from-file>>")
def save(self, event): def save(self, event):
self.text.event_generate("<<save-window>>") self.text.event_generate("<<save-window>>")
def save_as(self, event):
self.text.event_generate("<<save-window-as-file>>")
def save_a_copy(self, event):
self.text.event_generate("<<save-copy-of-window-as-file>>")
text = Text(root) text = Text(root)
text.pack() text.pack()
text.focus_set() text.focus_set()
editwin = MyEditWin(text) editwin = MyEditWin(text)
io = IOBinding(editwin) io = IOBinding(editwin)
root.mainloop()
if __name__ == "__main__": if __name__ == "__main__":
test() from idlelib.idle_test.htest import run
run(_io_binding)

View File

@ -420,9 +420,12 @@ def __del__(self):
_multicall_dict[widget] = MultiCall _multicall_dict[widget] = MultiCall
return MultiCall return MultiCall
if __name__ == "__main__":
# Test def _multi_call(parent):
root = tkinter.Tk() root = tkinter.Tk()
root.title("Test MultiCall")
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
text = MultiCallCreator(tkinter.Text)(root) text = MultiCallCreator(tkinter.Text)(root)
text.pack() text.pack()
def bindseq(seq, n=[0]): def bindseq(seq, n=[0]):
@ -438,8 +441,13 @@ def handler(event):
bindseq("<Alt-Control-Key-a>") bindseq("<Alt-Control-Key-a>")
bindseq("<Key-b>") bindseq("<Key-b>")
bindseq("<Control-Button-1>") bindseq("<Control-Button-1>")
bindseq("<Button-2>")
bindseq("<Alt-Button-1>") bindseq("<Alt-Button-1>")
bindseq("<FocusOut>") bindseq("<FocusOut>")
bindseq("<Enter>") bindseq("<Enter>")
bindseq("<Leave>") bindseq("<Leave>")
root.mainloop() root.mainloop()
if __name__ == "__main__":
from idlelib.idle_test.htest import run
run(_multi_call)

View File

@ -17,16 +17,29 @@ def set_label(self, name, text='', side=LEFT):
label = self.labels[name] label = self.labels[name]
label.config(text=text) label.config(text=text)
def _test(): def _multistatus_bar(parent):
b = Frame() root = Tk()
c = Text(b) width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
c.pack(side=TOP) root.geometry("+%d+%d" %(x, y + 150))
a = MultiStatusBar(b) root.title("Test multistatus bar")
a.set_label("one", "hello") frame = Frame(root)
a.set_label("two", "world") text = Text(frame)
a.pack(side=BOTTOM, fill=X) text.pack()
b.pack() msb = MultiStatusBar(frame)
b.mainloop() msb.set_label("one", "hello")
msb.set_label("two", "world")
msb.pack(side=BOTTOM, fill=X)
def change():
msb.set_label("one", "foo")
msb.set_label("two", "bar")
button = Button(root, text="Update status", command=change)
button.pack(side=BOTTOM)
frame.pack()
frame.mainloop()
root.mainloop()
if __name__ == '__main__': if __name__ == '__main__':
_test() from idlelib.idle_test.htest import run
run(_multistatus_bar)

View File

@ -9,6 +9,8 @@
# XXX TO DO: # XXX TO DO:
# - for classes/modules, add "open source" to object browser # - for classes/modules, add "open source" to object browser
import re
from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
from reprlib import Repr from reprlib import Repr
@ -119,12 +121,13 @@ def make_objecttreeitem(labeltext, object, setfunction=None):
c = ObjectTreeItem c = ObjectTreeItem
return c(labeltext, object, setfunction) return c(labeltext, object, setfunction)
# Test script
def _test(): def _object_browser(parent):
import sys import sys
from tkinter import Tk from tkinter import Tk
root = Tk() root = Tk()
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 100))
root.configure(bd=0, bg="yellow") root.configure(bd=0, bg="yellow")
root.focus_set() root.focus_set()
sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1) sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
@ -135,4 +138,5 @@ def _test():
root.mainloop() root.mainloop()
if __name__ == '__main__': if __name__ == '__main__':
_test() from idlelib.idle_test.htest import run
run(_object_browser)

View File

@ -1,13 +1,20 @@
import os import os
import sys import sys
import re
import importlib.machinery import importlib.machinery
from idlelib.TreeWidget import TreeItem from idlelib.TreeWidget import TreeItem
from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
from idlelib.PyShell import PyShellFileList
class PathBrowser(ClassBrowser): class PathBrowser(ClassBrowser):
def __init__(self, flist): def __init__(self, flist, _htest=False):
"""
_htest - bool, change box location when running htest
"""
self._htest = _htest
self.init(flist) self.init(flist)
def settitle(self): def settitle(self):
@ -87,12 +94,13 @@ def listmodules(self, allnames):
sorted.sort() sorted.sort()
return sorted return sorted
def main(): def _path_browser(parent):
from idlelib import PyShell flist = PyShellFileList(parent)
PathBrowser(PyShell.flist) PathBrowser(flist, _htest=True)
if sys.stdin is sys.__stdin__:
mainloop()
if __name__ == "__main__": if __name__ == "__main__":
from unittest import main from unittest import main
main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False) main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
from idlelib.idle_test.htest import run
run(_path_browser)

View File

@ -119,21 +119,22 @@ def on_double(self, index):
pass pass
def test(): def _scrolled_list(parent):
root = Tk() root = Tk()
root.protocol("WM_DELETE_WINDOW", root.destroy) root.title("Test ScrolledList")
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
class MyScrolledList(ScrolledList): class MyScrolledList(ScrolledList):
def fill_menu(self): self.menu.add_command(label="pass") def fill_menu(self): self.menu.add_command(label="right click")
def on_select(self, index): print("select", self.get(index)) def on_select(self, index): print("select", self.get(index))
def on_double(self, index): print("double", self.get(index)) def on_double(self, index): print("double", self.get(index))
s = MyScrolledList(root)
for i in range(30):
s.append("item %02d" % i)
return root
def main(): scrolled_list = MyScrolledList(root)
root = test() for i in range(30):
scrolled_list.append("Item %02d" % i)
root.mainloop() root.mainloop()
if __name__ == '__main__': if __name__ == '__main__':
main() from idlelib.idle_test.htest import run
run(_scrolled_list)

View File

@ -76,14 +76,21 @@ def showcontents(self):
for item in self.items: for item in self.items:
listbox.insert(END, item) listbox.insert(END, item)
def main(): def _tooltip(parent):
# Test code
root = Tk() root = Tk()
b = Button(root, text="Hello", command=root.destroy) root.title("Test tooltip")
b.pack() width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.update() root.geometry("+%d+%d"%(x, y + 150))
tip = ListboxToolTip(b, ["Hello", "world"]) label = Label(root, text="Place your mouse over buttons")
label.pack()
button1 = Button(root, text="Button 1")
button2 = Button(root, text="Button 2")
button1.pack()
button2.pack()
ToolTip(button1, "This is calltip text for button1.")
ListboxToolTip(button2, ["This is","calltip text","for button2"])
root.mainloop() root.mainloop()
if __name__ == '__main__': if __name__ == '__main__':
main() from idlelib.idle_test.htest import run
run(_tooltip)

View File

@ -448,29 +448,27 @@ def zoom_height(self, event):
return "break" return "break"
# Testing functions def _tree_widget(parent):
root = Tk()
def test(): root.title("Test TreeWidget")
from idlelib import PyShell width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root = Toplevel(PyShell.root) root.geometry("+%d+%d"%(x, y + 150))
root.configure(bd=0, bg="yellow") # test with scrollable canvas
root.focus_set()
sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1) sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
sc.frame.pack(expand=1, fill="both") sc.frame.pack(expand=1, fill="both", side=LEFT)
item = FileTreeItem("C:/windows/desktop") item = FileTreeItem(os.getcwd())
node = TreeNode(sc.canvas, None, item) node = TreeNode(sc.canvas, None, item)
node.expand() node.expand()
def test2(): # test without scrollable canvas
# test w/o scrolling canvas
root = Tk()
root.configure(bd=0)
canvas = Canvas(root, bg="white", highlightthickness=0) canvas = Canvas(root, bg="white", highlightthickness=0)
canvas.pack(expand=1, fill="both") canvas.pack(expand=0, fill="both", side=RIGHT)
item = FileTreeItem(os.curdir) item = FileTreeItem(os.getcwd())
node = TreeNode(canvas, None, item) node = TreeNode(canvas, None, item)
node.update() node.update()
canvas.focus_set()
root.mainloop()
if __name__ == '__main__': if __name__ == '__main__':
test() from idlelib.idle_test.htest import run
run(_tree_widget)

View File

@ -104,10 +104,12 @@ def __call__(self, *args):
return self.tk_call(self.orig_and_operation + args) return self.tk_call(self.orig_and_operation + args)
def main(): def _widget_redirector(parent):
root = Tk() root = Tk()
root.wm_protocol("WM_DELETE_WINDOW", root.quit) root.title("Test WidgetRedirector")
text = Text() width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
text = Text(root)
text.pack() text.pack()
text.focus_set() text.focus_set()
redir = WidgetRedirector(text) redir = WidgetRedirector(text)
@ -117,10 +119,7 @@ def my_insert(*args):
previous_tcl_fcn(*args) previous_tcl_fcn(*args)
previous_tcl_fcn = redir.register("insert", my_insert) previous_tcl_fcn = redir.register("insert", my_insert)
root.mainloop() root.mainloop()
redir.unregister("insert") # runs after first 'close window'
redir.close()
root.mainloop()
root.destroy()
if __name__ == "__main__": if __name__ == "__main__":
main() from idlelib.idle_test.htest import run
run(_widget_redirector)

View File

@ -12,11 +12,16 @@ class AboutDialog(Toplevel):
"""Modal about dialog for idle """Modal about dialog for idle
""" """
def __init__(self, parent, title): def __init__(self, parent, title, _htest=False):
"""
_htest - bool, change box location when running htest
"""
Toplevel.__init__(self, parent) Toplevel.__init__(self, parent)
self.configure(borderwidth=5) self.configure(borderwidth=5)
self.geometry("+%d+%d" % (parent.winfo_rootx()+30, # place dialog below parent if running htest
parent.winfo_rooty()+30)) self.geometry("+%d+%d" % (
parent.winfo_rootx()+30,
parent.winfo_rooty()+(30 if not _htest else 100)))
self.bg = "#707070" self.bg = "#707070"
self.fg = "#ffffff" self.fg = "#ffffff"
self.CreateWidgets() self.CreateWidgets()

View File

@ -8,13 +8,14 @@
import tkinter.filedialog as tkFileDialog import tkinter.filedialog as tkFileDialog
class GetHelpSourceDialog(Toplevel): class GetHelpSourceDialog(Toplevel):
def __init__(self, parent, title, menuItem='', filePath=''): def __init__(self, parent, title, menuItem='', filePath='', _htest=False):
"""Get menu entry and url/ local file location for Additional Help """Get menu entry and url/ local file location for Additional Help
User selects a name for the Help resource and provides a web url User selects a name for the Help resource and provides a web url
or a local file as its source. The user can enter a url or browse or a local file as its source. The user can enter a url or browse
for the file. for the file.
_htest - bool, change box location when running htest
""" """
Toplevel.__init__(self, parent) Toplevel.__init__(self, parent)
self.configure(borderwidth=5) self.configure(borderwidth=5)
@ -31,12 +32,14 @@ def __init__(self, parent, title, menuItem='', filePath=''):
self.withdraw() #hide while setting geometry self.withdraw() #hide while setting geometry
#needs to be done here so that the winfo_reqwidth is valid #needs to be done here so that the winfo_reqwidth is valid
self.update_idletasks() self.update_idletasks()
#centre dialog over parent: #centre dialog over parent. below parent if running htest.
self.geometry("+%d+%d" % self.geometry(
((parent.winfo_rootx() + ((parent.winfo_width()/2) "+%d+%d" % (
-(self.winfo_reqwidth()/2)), parent.winfo_rootx() +
parent.winfo_rooty() + ((parent.winfo_height()/2) (parent.winfo_width()/2 - self.winfo_reqwidth()/2),
-(self.winfo_reqheight()/2))))) parent.winfo_rooty() +
((parent.winfo_height()/2 - self.winfo_reqheight()/2)
if not _htest else 150)))
self.deiconify() #geometry set, unhide self.deiconify() #geometry set, unhide
self.bind('<Return>', self.Ok) self.bind('<Return>', self.Ok)
self.wait_window() self.wait_window()
@ -159,11 +162,5 @@ def Cancel(self, event=None):
self.destroy() self.destroy()
if __name__ == '__main__': if __name__ == '__main__':
#test the dialog from idlelib.idle_test.htest import run
root = Tk() run(GetHelpSourceDialog)
def run():
keySeq = ''
dlg = GetHelpSourceDialog(root, 'Get Help Source')
print(dlg.result)
Button(root,text='Dialog', command=run).pack()
root.mainloop()

View File

@ -2,9 +2,10 @@
OptionMenu widget modified to allow dynamic menu reconfiguration OptionMenu widget modified to allow dynamic menu reconfiguration
and setting of highlightthickness and setting of highlightthickness
""" """
from tkinter import OptionMenu from tkinter import OptionMenu, _setit, Tk, StringVar, Button
from tkinter import _setit
import copy import copy
import re
class DynOptionMenu(OptionMenu): class DynOptionMenu(OptionMenu):
""" """
@ -33,3 +34,24 @@ def SetMenu(self,valueList,value=None):
command=_setit(self.variable,item,self.command)) command=_setit(self.variable,item,self.command))
if value: if value:
self.variable.set(value) self.variable.set(value)
def _dyn_option_menu(parent):
root = Tk()
root.title("Tets dynamic option menu")
var = StringVar(root)
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 150))
var.set("Old option set") #Set the default value
dyn = DynOptionMenu(root,var, "old1","old2","old3","old4")
dyn.pack()
def update():
dyn.SetMenu(["new1","new2","new3","new4"],value="new option set")
button = Button(root, text="Change option set", command=update)
button.pack()
root.mainloop()
if __name__ == '__main__':
from idlelib.idle_test.htest import run
run(_dyn_option_menu)

View File

@ -35,17 +35,51 @@
AboutDialog_spec = { AboutDialog_spec = {
'file': 'aboutDialog', 'file': 'aboutDialog',
'kwds': {'title': 'About test'}, 'kwds': {'title': 'aboutDialog test',
'msg': "Try each button" '_htest': True,
} },
'msg': "Test every button. Ensure Python, TK and IDLE versions "
"are correctly displayed.\n [Close] to exit.",
}
_calltip_window_spec = {
_editor_window_spec = { 'file': 'CallTipWindow',
'file': 'EditorWindow',
'kwds': {}, 'kwds': {},
'msg': "Test editor functions of interest" 'msg': "Typing '(' should display a calltip.\n"
"Typing ') should hide the calltip.\n"
} }
_class_browser_spec = {
'file': 'ClassBrowser',
'kwds': {},
'msg': "Inspect names of module, class(with superclass if "
"applicable), methods and functions.\nToggle nested items."
"\nN.S: Double click on items does not work",
}
_color_delegator_spec = {
'file': 'ColorDelegator',
'kwds': {},
'msg': "The text is sample Python code.\n"
"Ensure components like comments, keywords, builtins,\n"
"string, definitions, and break are correctly colored.\n"
"The default color scheme is in idlelib/config-highlight.def"
}
_dyn_option_menu_spec = {
'file': 'dynOptionMenuWidget',
'kwds': {},
'msg': "Select one of the many options in the 'old option set'.\n"
"Click the button to change the option set.\n"
"Select one of the many options in the 'new option set'."
}
#_editor_window_spec = {
# 'file': 'EditorWindow',
# 'kwds': {},
# 'msg': "Test editor functions of interest"
# }
GetCfgSectionNameDialog_spec = { GetCfgSectionNameDialog_spec = {
'file': 'configSectionNameDialog', 'file': 'configSectionNameDialog',
'kwds': {'title':'Get Name', 'kwds': {'title':'Get Name',
@ -54,7 +88,19 @@
'_htest': True}, '_htest': True},
'msg': "After the text entered with [Ok] is stripped, <nothing>, " 'msg': "After the text entered with [Ok] is stripped, <nothing>, "
"'abc', or more that 30 chars are errors.\n" "'abc', or more that 30 chars are errors.\n"
"Close 'Get Name' with a valid entry (printed to Shell), [Cancel], or [X]", "Close 'Get Name' with a valid entry (printed to Shell), "
"[Cancel], or [X]",
}
GetHelpSourceDialog_spec = {
'file': 'configHelpSourceEdit',
'kwds': {'title': 'Get helpsource',
'_htest': True},
'msg': "Enter menu item name and help file path\n "
"<nothing> and more than 30 chars are invalid menu item names.\n"
"<nothing>, file does not exist are invalid path items.\n"
"Test for incomplete web address for help file path.\n"
"A valid entry will be printed to shell with [0k].\n"
"[Cancel] will print None to shell",
} }
_help_dialog_spec = { _help_dialog_spec = {
@ -63,30 +109,152 @@
'msg': "If the help text displays, this works" 'msg': "If the help text displays, this works"
} }
def run(test): _io_binding_spec = {
"Display a widget with callable *test* using a _spec dict" 'file': 'IOBinding',
'kwds': {},
'msg': "Test the following bindings\n"
"<Control-o> to display open window from file dialog.\n"
"<Control-s> to save the file\n"
}
_multi_call_spec = {
'file': 'MultiCall',
'kwds': {},
'msg': "The following actions should trigger a print to console.\n"
"Entering and leaving the text area, key entry, <Control-Key>,\n"
"<Alt-Key-a>, <Control-Key-a>, <Alt-Control-Key-a>, \n"
"<Control-Button-1>, <Alt-Button-1> and focussing out of the window\n"
"are sequences to be tested."
}
_multistatus_bar_spec = {
'file': 'MultiStatusBar',
'kwds': {},
'msg': "Ensure presence of multi-status bar below text area.\n"
"Click 'Update Status' to change the multi-status text"
}
_object_browser_spec = {
'file': 'ObjectBrowser',
'kwds': {},
'msg': "Double click on items upto the lowest level.\n"
"Attributes of the objects and related information "
"will be displayed side-by-side at each level."
}
_path_browser_spec = {
'file': 'PathBrowser',
'kwds': {},
'msg': "Test for correct display of all paths in sys.path."
"\nToggle nested items upto the lowest level."
"\nN.S: Double click on items does not work."
}
_scrolled_list_spec = {
'file': 'ScrolledList',
'kwds': {},
'msg': "You should see a scrollable list of items\n"
"Selecting an item will print it to console.\n"
"Double clicking an item will print it to console\n"
"Right click on an item will display a popup."
}
_tabbed_pages_spec = {
'file': 'tabbedpages',
'kwds': {},
'msg': "Toggle between the two tabs 'foo' and 'bar'\n"
"Add a tab by entering a suitable name for it.\n"
"Remove an existing tab by entering its name.\n"
"Remove all existing tabs.\n"
"<nothing> is an invalid add page and remove page name.\n"
}
TextViewer_spec = {
'file': 'textView',
'kwds': {'title': 'Test textView',
'text':'The quick brown fox jumps over the lazy dog.\n'*35,
'_htest': True},
'msg': "Test for read-only property of text.\n"
"Text is selectable. Window is scrollable.",
}
_tooltip_spec = {
'file': 'ToolTip',
'kwds': {},
'msg': "Place mouse cursor over both the buttons\n"
"A tooltip should appear with some text."
}
_tree_widget_spec = {
'file': 'TreeWidget',
'kwds': {},
'msg': "You should see two canvas' side-by-side.\n"
"The left canvas is scrollable.\n"
"The right canvas is not scrollable.\n"
"Click on folders upto to the lowest level."
}
_widget_redirector_spec = {
'file': 'WidgetRedirector',
'kwds': {},
'msg': "Every text insert should be printed to console."
}
def run(test=None):
root = tk.Tk() root = tk.Tk()
test_spec = globals()[test.__name__ + '_spec'] test_list = [] # List of tuples of the form (spec, kwds, callable widget)
test_kwds = test_spec['kwds'] if test:
test_kwds['parent'] = root test_spec = globals()[test.__name__ + '_spec']
test_spec['name'] = test.__name__
test_kwds = test_spec['kwds']
test_kwds['parent'] = root
test_list.append((test_spec, test_kwds, test))
else:
for k, d in globals().items():
if k.endswith('_spec'):
test_name = k[:-5]
test_spec = d
test_spec['name'] = test_name
test_kwds = test_spec['kwds']
test_kwds['parent'] = root
mod = import_module('idlelib.' + test_spec['file'])
test = getattr(mod, test_name)
test_list.append((test_spec, test_kwds, test))
help_string = tk.StringVar('')
test_name = tk.StringVar('')
callable_object = None
test_kwds = None
def next():
nonlocal help_string, test_name, callable_object, test_kwds
if len(test_list) == 1:
next_button.pack_forget()
test_spec, test_kwds, test = test_list.pop()
help_string.set(test_spec['msg'])
test_name.set('test ' + test_spec['name'])
callable_object = test
def run_test(): def run_test():
widget = test(**test_kwds) widget = callable_object(**test_kwds)
try: try:
print(widget.result) print(widget.result)
except AttributeError: except AttributeError:
pass pass
tk.Label(root, text=test_spec['msg'], justify='left').pack()
tk.Button(root, text='Test ' + test.__name__, command=run_test).pack() label = tk.Label(root, textvariable=help_string, justify='left')
label.pack()
button = tk.Button(root, textvariable=test_name, command=run_test)
button.pack()
next_button = tk.Button(root, text="Next", command=next)
next_button.pack()
next()
root.mainloop() root.mainloop()
def runall():
"Run all tests. Quick and dirty version."
for k, d in globals().items():
if k.endswith('_spec'):
mod = import_module('idlelib.' + d['file'])
test = getattr(mod, k[:-5])
run(test)
if __name__ == '__main__': if __name__ == '__main__':
runall() run()

View File

@ -467,9 +467,12 @@ def change_page(self, page_name):
self._tab_set.set_selected_tab(page_name) self._tab_set.set_selected_tab(page_name)
if __name__ == '__main__': def _tabbed_pages(parent):
# test dialog # test dialog
root=Tk() root=Tk()
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
root.geometry("+%d+%d"%(x, y + 175))
root.title("Test tabbed pages")
tabPage=TabbedPageSet(root, page_names=['Foobar','Baz'], n_rows=0, tabPage=TabbedPageSet(root, page_names=['Foobar','Baz'], n_rows=0,
expand_tabs=False, expand_tabs=False,
) )
@ -488,3 +491,8 @@ def change_page(self, page_name):
labelPgName.pack(padx=5) labelPgName.pack(padx=5)
entryPgName.pack(padx=5) entryPgName.pack(padx=5)
root.mainloop() root.mainloop()
if __name__ == '__main__':
from idlelib.idle_test.htest import run
run(_tabbed_pages)

View File

@ -9,15 +9,17 @@ class TextViewer(Toplevel):
"""A simple text viewer dialog for IDLE """A simple text viewer dialog for IDLE
""" """
def __init__(self, parent, title, text, modal=True): def __init__(self, parent, title, text, modal=True, _htest=False):
"""Show the given text in a scrollable window with a 'close' button """Show the given text in a scrollable window with a 'close' button
_htest - bool, change box location when running htest
""" """
Toplevel.__init__(self, parent) Toplevel.__init__(self, parent)
self.configure(borderwidth=5) self.configure(borderwidth=5)
# place dialog below parent if running htest
self.geometry("=%dx%d+%d+%d" % (625, 500, self.geometry("=%dx%d+%d+%d" % (625, 500,
parent.winfo_rootx() + 10, parent.winfo_rootx() + 10,
parent.winfo_rooty() + 10)) parent.winfo_rooty() + (10 if not _htest else 100)))
#elguavas - config placeholders til config stuff completed #elguavas - config placeholders til config stuff completed
self.bg = '#ffffff' self.bg = '#ffffff'
self.fg = '#000000' self.fg = '#000000'
@ -74,24 +76,6 @@ def view_file(parent, title, filename, encoding=None, modal=True):
else: else:
return view_text(parent, title, contents, modal) return view_text(parent, title, contents, modal)
if __name__ == '__main__': if __name__ == '__main__':
#test the dialog from idlelib.idle_test.htest import run
root=Tk() run(TextViewer)
root.title('textView test')
filename = './textView.py'
with open(filename, 'r') as f:
text = f.read()
btn1 = Button(root, text='view_text',
command=lambda:view_text(root, 'view_text', text))
btn1.pack(side=LEFT)
btn2 = Button(root, text='view_file',
command=lambda:view_file(root, 'view_file', filename))
btn2.pack(side=LEFT)
btn3 = Button(root, text='nonmodal view_text',
command=lambda:view_text(root, 'nonmodal view_text', text,
modal=False))
btn3.pack(side=LEFT)
close = Button(root, text='Close', command=root.destroy)
close.pack(side=RIGHT)
root.mainloop()