mirror of https://github.com/python/cpython
Issue #21477: Idle htest: merge and modify run and runall; add many tests.
Patch by Saimadhav Heblikar
This commit is contained in:
parent
10cbb1e463
commit
1b392ffe67
|
@ -133,37 +133,36 @@ class CallTip:
|
|||
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))
|
||||
|
||||
###############################
|
||||
#
|
||||
# Test Code
|
||||
#
|
||||
class container: # Conceptually an editor_window
|
||||
def __init__(self):
|
||||
root = Tk()
|
||||
text = self.text = Text(root)
|
||||
text.pack(side=LEFT, fill=BOTH, expand=1)
|
||||
text.insert("insert", "string.split")
|
||||
root.update()
|
||||
self.calltip = CallTip(text)
|
||||
class MyEditWin: # comparenceptually an editor_window
|
||||
def __init__(self):
|
||||
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-hide>>", ")")
|
||||
text.bind("<<calltip-show>>", self.calltip_show)
|
||||
text.bind("<<calltip-hide>>", self.calltip_hide)
|
||||
text.event_add("<<calltip-show>>", "(")
|
||||
text.event_add("<<calltip-hide>>", ")")
|
||||
text.bind("<<calltip-show>>", self.calltip_show)
|
||||
text.bind("<<calltip-hide>>", self.calltip_hide)
|
||||
|
||||
text.focus_set()
|
||||
root.mainloop()
|
||||
text.focus_set()
|
||||
root.mainloop()
|
||||
|
||||
def calltip_show(self, event):
|
||||
self.calltip.showtip("Hello world")
|
||||
def calltip_show(self, event):
|
||||
self.calltip.showtip("Hello world", "insert", "end")
|
||||
|
||||
def calltip_hide(self, event):
|
||||
self.calltip.hidetip()
|
||||
def calltip_hide(self, event):
|
||||
self.calltip.hidetip()
|
||||
|
||||
def main():
|
||||
# Test code
|
||||
c=container()
|
||||
editwin = MyEditWin()
|
||||
|
||||
if __name__=='__main__':
|
||||
main()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_calltip_window)
|
||||
|
|
|
@ -13,6 +13,7 @@ XXX TO DO:
|
|||
import os
|
||||
import sys
|
||||
import pyclbr
|
||||
import re
|
||||
|
||||
from idlelib import PyShell
|
||||
from idlelib.WindowList import ListedToplevel
|
||||
|
@ -21,11 +22,15 @@ from idlelib.configHandler import idleConf
|
|||
|
||||
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 the code here is bogus!
|
||||
"""
|
||||
_htest - bool, change box when location running htest.
|
||||
"""
|
||||
self.name = name
|
||||
self.file = os.path.join(path[0], self.name + ".py")
|
||||
self._htest = _htest
|
||||
self.init(flist)
|
||||
|
||||
def close(self, event=None):
|
||||
|
@ -40,6 +45,9 @@ class ClassBrowser:
|
|||
self.top = top = ListedToplevel(flist.root)
|
||||
top.protocol("WM_DELETE_WINDOW", 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()
|
||||
top.focus_set()
|
||||
# create scrolled canvas
|
||||
|
@ -202,7 +210,7 @@ class MethodBrowserTreeItem(TreeItem):
|
|||
edit = PyShell.flist.open(self.file)
|
||||
edit.gotoline(self.cl.methods[self.name])
|
||||
|
||||
def main():
|
||||
def _class_browser(parent): #Wrapper for htest
|
||||
try:
|
||||
file = __file__
|
||||
except NameError:
|
||||
|
@ -213,9 +221,9 @@ def main():
|
|||
file = sys.argv[0]
|
||||
dir, file = os.path.split(file)
|
||||
name = os.path.splitext(file)[0]
|
||||
ClassBrowser(PyShell.flist, name, [dir])
|
||||
if sys.stdin is sys.__stdin__:
|
||||
mainloop()
|
||||
flist = PyShell.PyShellFileList(parent)
|
||||
ClassBrowser(flist, name, [dir], _htest=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_class_browser)
|
||||
|
|
|
@ -253,17 +253,23 @@ class ColorDelegator(Delegator):
|
|||
for tag in self.tagdefs:
|
||||
self.tag_remove(tag, "1.0", "end")
|
||||
|
||||
def main():
|
||||
def _color_delegator(parent):
|
||||
from idlelib.Percolator import Percolator
|
||||
root = Tk()
|
||||
root.wm_protocol("WM_DELETE_WINDOW", root.quit)
|
||||
text = Text(background="white")
|
||||
root.title("Test ColorDelegator")
|
||||
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.focus_set()
|
||||
p = Percolator(text)
|
||||
d = ColorDelegator()
|
||||
p.insertfilter(d)
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_color_delegator)
|
||||
|
|
|
@ -525,16 +525,17 @@ class IOBinding:
|
|||
if self.editwin.flist:
|
||||
self.editwin.update_recent_files_list(filename)
|
||||
|
||||
def test():
|
||||
def _io_binding(parent):
|
||||
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:
|
||||
def __init__(self, text):
|
||||
self.text = text
|
||||
self.flist = None
|
||||
self.text.bind("<Control-o>", self.open)
|
||||
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 set_saved(self, flag): pass
|
||||
def reset_undo(self): pass
|
||||
|
@ -542,16 +543,13 @@ def test():
|
|||
self.text.event_generate("<<open-window-from-file>>")
|
||||
def save(self, event):
|
||||
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.pack()
|
||||
text.focus_set()
|
||||
editwin = MyEditWin(text)
|
||||
io = IOBinding(editwin)
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
test()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_io_binding)
|
||||
|
|
|
@ -420,9 +420,12 @@ def MultiCallCreator(widget):
|
|||
_multicall_dict[widget] = MultiCall
|
||||
return MultiCall
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Test
|
||||
|
||||
def _multi_call(parent):
|
||||
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.pack()
|
||||
def bindseq(seq, n=[0]):
|
||||
|
@ -438,8 +441,13 @@ if __name__ == "__main__":
|
|||
bindseq("<Alt-Control-Key-a>")
|
||||
bindseq("<Key-b>")
|
||||
bindseq("<Control-Button-1>")
|
||||
bindseq("<Button-2>")
|
||||
bindseq("<Alt-Button-1>")
|
||||
bindseq("<FocusOut>")
|
||||
bindseq("<Enter>")
|
||||
bindseq("<Leave>")
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_multi_call)
|
||||
|
|
|
@ -17,16 +17,29 @@ class MultiStatusBar(Frame):
|
|||
label = self.labels[name]
|
||||
label.config(text=text)
|
||||
|
||||
def _test():
|
||||
b = Frame()
|
||||
c = Text(b)
|
||||
c.pack(side=TOP)
|
||||
a = MultiStatusBar(b)
|
||||
a.set_label("one", "hello")
|
||||
a.set_label("two", "world")
|
||||
a.pack(side=BOTTOM, fill=X)
|
||||
b.pack()
|
||||
b.mainloop()
|
||||
def _multistatus_bar(parent):
|
||||
root = Tk()
|
||||
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
|
||||
root.geometry("+%d+%d" %(x, y + 150))
|
||||
root.title("Test multistatus bar")
|
||||
frame = Frame(root)
|
||||
text = Text(frame)
|
||||
text.pack()
|
||||
msb = MultiStatusBar(frame)
|
||||
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__':
|
||||
_test()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_multistatus_bar)
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
# XXX TO DO:
|
||||
# - for classes/modules, add "open source" to object browser
|
||||
|
||||
import re
|
||||
|
||||
from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
|
||||
|
||||
from reprlib import Repr
|
||||
|
@ -119,12 +121,13 @@ def make_objecttreeitem(labeltext, object, setfunction=None):
|
|||
c = ObjectTreeItem
|
||||
return c(labeltext, object, setfunction)
|
||||
|
||||
# Test script
|
||||
|
||||
def _test():
|
||||
def _object_browser(parent):
|
||||
import sys
|
||||
from tkinter import 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.focus_set()
|
||||
sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
|
||||
|
@ -135,4 +138,5 @@ def _test():
|
|||
root.mainloop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
_test()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_object_browser)
|
||||
|
|
|
@ -1,13 +1,20 @@
|
|||
import os
|
||||
import sys
|
||||
import re
|
||||
import importlib.machinery
|
||||
|
||||
from idlelib.TreeWidget import TreeItem
|
||||
from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
|
||||
from idlelib.PyShell import PyShellFileList
|
||||
|
||||
|
||||
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)
|
||||
|
||||
def settitle(self):
|
||||
|
@ -87,12 +94,13 @@ class DirBrowserTreeItem(TreeItem):
|
|||
sorted.sort()
|
||||
return sorted
|
||||
|
||||
def main():
|
||||
from idlelib import PyShell
|
||||
PathBrowser(PyShell.flist)
|
||||
if sys.stdin is sys.__stdin__:
|
||||
mainloop()
|
||||
def _path_browser(parent):
|
||||
flist = PyShellFileList(parent)
|
||||
PathBrowser(flist, _htest=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
from unittest import main
|
||||
main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
|
||||
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_path_browser)
|
||||
|
|
|
@ -119,21 +119,22 @@ class ScrolledList:
|
|||
pass
|
||||
|
||||
|
||||
def test():
|
||||
def _scrolled_list(parent):
|
||||
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):
|
||||
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_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():
|
||||
root = test()
|
||||
scrolled_list = MyScrolledList(root)
|
||||
for i in range(30):
|
||||
scrolled_list.append("Item %02d" % i)
|
||||
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_scrolled_list)
|
||||
|
|
|
@ -76,14 +76,21 @@ class ListboxToolTip(ToolTipBase):
|
|||
for item in self.items:
|
||||
listbox.insert(END, item)
|
||||
|
||||
def main():
|
||||
# Test code
|
||||
def _tooltip(parent):
|
||||
root = Tk()
|
||||
b = Button(root, text="Hello", command=root.destroy)
|
||||
b.pack()
|
||||
root.update()
|
||||
tip = ListboxToolTip(b, ["Hello", "world"])
|
||||
root.title("Test tooltip")
|
||||
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
|
||||
root.geometry("+%d+%d"%(x, y + 150))
|
||||
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()
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_tooltip)
|
||||
|
|
|
@ -448,29 +448,27 @@ class ScrolledCanvas:
|
|||
return "break"
|
||||
|
||||
|
||||
# Testing functions
|
||||
|
||||
def test():
|
||||
from idlelib import PyShell
|
||||
root = Toplevel(PyShell.root)
|
||||
root.configure(bd=0, bg="yellow")
|
||||
root.focus_set()
|
||||
def _tree_widget(parent):
|
||||
root = Tk()
|
||||
root.title("Test TreeWidget")
|
||||
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
|
||||
root.geometry("+%d+%d"%(x, y + 150))
|
||||
# test with scrollable canvas
|
||||
sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
|
||||
sc.frame.pack(expand=1, fill="both")
|
||||
item = FileTreeItem("C:/windows/desktop")
|
||||
sc.frame.pack(expand=1, fill="both", side=LEFT)
|
||||
item = FileTreeItem(os.getcwd())
|
||||
node = TreeNode(sc.canvas, None, item)
|
||||
node.expand()
|
||||
|
||||
def test2():
|
||||
# test w/o scrolling canvas
|
||||
root = Tk()
|
||||
root.configure(bd=0)
|
||||
# test without scrollable canvas
|
||||
canvas = Canvas(root, bg="white", highlightthickness=0)
|
||||
canvas.pack(expand=1, fill="both")
|
||||
item = FileTreeItem(os.curdir)
|
||||
canvas.pack(expand=0, fill="both", side=RIGHT)
|
||||
item = FileTreeItem(os.getcwd())
|
||||
node = TreeNode(canvas, None, item)
|
||||
node.update()
|
||||
canvas.focus_set()
|
||||
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_tree_widget)
|
||||
|
|
|
@ -104,10 +104,12 @@ class OriginalCommand:
|
|||
return self.tk_call(self.orig_and_operation + args)
|
||||
|
||||
|
||||
def main():
|
||||
def _widget_redirector(parent):
|
||||
root = Tk()
|
||||
root.wm_protocol("WM_DELETE_WINDOW", root.quit)
|
||||
text = Text()
|
||||
root.title("Test WidgetRedirector")
|
||||
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.focus_set()
|
||||
redir = WidgetRedirector(text)
|
||||
|
@ -117,10 +119,7 @@ def main():
|
|||
previous_tcl_fcn(*args)
|
||||
previous_tcl_fcn = redir.register("insert", my_insert)
|
||||
root.mainloop()
|
||||
redir.unregister("insert") # runs after first 'close window'
|
||||
redir.close()
|
||||
root.mainloop()
|
||||
root.destroy()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_widget_redirector)
|
||||
|
|
|
@ -12,11 +12,16 @@ class AboutDialog(Toplevel):
|
|||
"""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)
|
||||
self.configure(borderwidth=5)
|
||||
self.geometry("+%d+%d" % (parent.winfo_rootx()+30,
|
||||
parent.winfo_rooty()+30))
|
||||
# place dialog below parent if running htest
|
||||
self.geometry("+%d+%d" % (
|
||||
parent.winfo_rootx()+30,
|
||||
parent.winfo_rooty()+(30 if not _htest else 100)))
|
||||
self.bg = "#707070"
|
||||
self.fg = "#ffffff"
|
||||
self.CreateWidgets()
|
||||
|
|
|
@ -8,13 +8,14 @@ import tkinter.messagebox as tkMessageBox
|
|||
import tkinter.filedialog as tkFileDialog
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
for the file.
|
||||
|
||||
_htest - bool, change box location when running htest
|
||||
"""
|
||||
Toplevel.__init__(self, parent)
|
||||
self.configure(borderwidth=5)
|
||||
|
@ -31,12 +32,14 @@ class GetHelpSourceDialog(Toplevel):
|
|||
self.withdraw() #hide while setting geometry
|
||||
#needs to be done here so that the winfo_reqwidth is valid
|
||||
self.update_idletasks()
|
||||
#centre dialog over parent:
|
||||
self.geometry("+%d+%d" %
|
||||
((parent.winfo_rootx() + ((parent.winfo_width()/2)
|
||||
-(self.winfo_reqwidth()/2)),
|
||||
parent.winfo_rooty() + ((parent.winfo_height()/2)
|
||||
-(self.winfo_reqheight()/2)))))
|
||||
#centre dialog over parent. below parent if running htest.
|
||||
self.geometry(
|
||||
"+%d+%d" % (
|
||||
parent.winfo_rootx() +
|
||||
(parent.winfo_width()/2 - self.winfo_reqwidth()/2),
|
||||
parent.winfo_rooty() +
|
||||
((parent.winfo_height()/2 - self.winfo_reqheight()/2)
|
||||
if not _htest else 150)))
|
||||
self.deiconify() #geometry set, unhide
|
||||
self.bind('<Return>', self.Ok)
|
||||
self.wait_window()
|
||||
|
@ -159,11 +162,5 @@ class GetHelpSourceDialog(Toplevel):
|
|||
self.destroy()
|
||||
|
||||
if __name__ == '__main__':
|
||||
#test the dialog
|
||||
root = Tk()
|
||||
def run():
|
||||
keySeq = ''
|
||||
dlg = GetHelpSourceDialog(root, 'Get Help Source')
|
||||
print(dlg.result)
|
||||
Button(root,text='Dialog', command=run).pack()
|
||||
root.mainloop()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(GetHelpSourceDialog)
|
||||
|
|
|
@ -2,9 +2,10 @@
|
|||
OptionMenu widget modified to allow dynamic menu reconfiguration
|
||||
and setting of highlightthickness
|
||||
"""
|
||||
from tkinter import OptionMenu
|
||||
from tkinter import _setit
|
||||
from tkinter import OptionMenu, _setit, Tk, StringVar, Button
|
||||
|
||||
import copy
|
||||
import re
|
||||
|
||||
class DynOptionMenu(OptionMenu):
|
||||
"""
|
||||
|
@ -33,3 +34,24 @@ class DynOptionMenu(OptionMenu):
|
|||
command=_setit(self.variable,item,self.command))
|
||||
if 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)
|
||||
|
|
|
@ -35,17 +35,51 @@ import tkinter as tk
|
|||
|
||||
AboutDialog_spec = {
|
||||
'file': 'aboutDialog',
|
||||
'kwds': {'title': 'About test'},
|
||||
'msg': "Try each button"
|
||||
}
|
||||
'kwds': {'title': 'aboutDialog test',
|
||||
'_htest': True,
|
||||
},
|
||||
'msg': "Test every button. Ensure Python, TK and IDLE versions "
|
||||
"are correctly displayed.\n [Close] to exit.",
|
||||
}
|
||||
|
||||
|
||||
_editor_window_spec = {
|
||||
'file': 'EditorWindow',
|
||||
_calltip_window_spec = {
|
||||
'file': 'CallTipWindow',
|
||||
'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 = {
|
||||
'file': 'configSectionNameDialog',
|
||||
'kwds': {'title':'Get Name',
|
||||
|
@ -54,7 +88,19 @@ GetCfgSectionNameDialog_spec = {
|
|||
'_htest': True},
|
||||
'msg': "After the text entered with [Ok] is stripped, <nothing>, "
|
||||
"'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 = {
|
||||
|
@ -63,30 +109,152 @@ _help_dialog_spec = {
|
|||
'msg': "If the help text displays, this works"
|
||||
}
|
||||
|
||||
def run(test):
|
||||
"Display a widget with callable *test* using a _spec dict"
|
||||
_io_binding_spec = {
|
||||
'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()
|
||||
test_spec = globals()[test.__name__ + '_spec']
|
||||
test_kwds = test_spec['kwds']
|
||||
test_kwds['parent'] = root
|
||||
test_list = [] # List of tuples of the form (spec, kwds, callable widget)
|
||||
if test:
|
||||
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():
|
||||
widget = test(**test_kwds)
|
||||
widget = callable_object(**test_kwds)
|
||||
try:
|
||||
print(widget.result)
|
||||
except AttributeError:
|
||||
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()
|
||||
|
||||
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__':
|
||||
runall()
|
||||
run()
|
||||
|
|
|
@ -467,9 +467,12 @@ class TabbedPageSet(Frame):
|
|||
|
||||
self._tab_set.set_selected_tab(page_name)
|
||||
|
||||
if __name__ == '__main__':
|
||||
def _tabbed_pages(parent):
|
||||
# test dialog
|
||||
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,
|
||||
expand_tabs=False,
|
||||
)
|
||||
|
@ -488,3 +491,8 @@ if __name__ == '__main__':
|
|||
labelPgName.pack(padx=5)
|
||||
entryPgName.pack(padx=5)
|
||||
root.mainloop()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from idlelib.idle_test.htest import run
|
||||
run(_tabbed_pages)
|
||||
|
|
|
@ -9,15 +9,17 @@ class TextViewer(Toplevel):
|
|||
"""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
|
||||
|
||||
_htest - bool, change box location when running htest
|
||||
"""
|
||||
Toplevel.__init__(self, parent)
|
||||
self.configure(borderwidth=5)
|
||||
# place dialog below parent if running htest
|
||||
self.geometry("=%dx%d+%d+%d" % (625, 500,
|
||||
parent.winfo_rootx() + 10,
|
||||
parent.winfo_rooty() + 10))
|
||||
parent.winfo_rootx() + 10,
|
||||
parent.winfo_rooty() + (10 if not _htest else 100)))
|
||||
#elguavas - config placeholders til config stuff completed
|
||||
self.bg = '#ffffff'
|
||||
self.fg = '#000000'
|
||||
|
@ -74,24 +76,6 @@ def view_file(parent, title, filename, encoding=None, modal=True):
|
|||
else:
|
||||
return view_text(parent, title, contents, modal)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
#test the dialog
|
||||
root=Tk()
|
||||
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()
|
||||
from idlelib.idle_test.htest import run
|
||||
run(TextViewer)
|
||||
|
|
Loading…
Reference in New Issue