Update of /cvsroot/pywin32/pywin32/Pythonwin/pywin/tools
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17967/tools
Modified Files:
Tag: py3k
TraceCollector.py browseProjects.py browser.py hierlist.py
regedit.py regpy.py
Log Message:
Changes for Python 3
Index: TraceCollector.py
===================================================================
RCS file: /cvsroot/pywin32/pywin32/Pythonwin/pywin/tools/TraceCollector.py,v
retrieving revision 1.3
retrieving revision 1.3.4.1
diff -C2 -d -r1.3 -r1.3.4.1
*** TraceCollector.py 9 Apr 2004 11:30:25 -0000 1.3
--- TraceCollector.py 29 Aug 2008 06:16:42 -0000 1.3.4.1
***************
*** 1,4 ****
# win32traceutil like utility for Pythonwin
! import thread
import win32trace, win32event, win32api
from pywin.framework import winout
--- 1,4 ----
# win32traceutil like utility for Pythonwin
! import _thread
import win32trace, win32event, win32api
from pywin.framework import winout
***************
*** 25,35 ****
finally:
win32trace.TermRead()
! print "Thread dieing"
class WindowOutput(winout.WindowOutput):
def __init__(self, *args):
! apply(winout.WindowOutput.__init__, (self,)+args)
self.hStopThread = win32event.CreateEvent(None, 0, 0, None)
! thread.start_new(CollectorThread, (self.hStopThread, self))
def _StopThread(self):
win32event.SetEvent(self.hStopThread)
--- 25,35 ----
finally:
win32trace.TermRead()
! print("Thread dieing")
class WindowOutput(winout.WindowOutput):
def __init__(self, *args):
! winout.WindowOutput.__init__(*(self,)+args)
self.hStopThread = win32event.CreateEvent(None, 0, 0, None)
! _thread.start_new(CollectorThread, (self.hStopThread, self))
def _StopThread(self):
win32event.SetEvent(self.hStopThread)
Index: regpy.py
===================================================================
RCS file: /cvsroot/pywin32/pywin32/Pythonwin/pywin/tools/regpy.py,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -C2 -d -r1.1 -r1.1.4.1
*** regpy.py 1 Sep 1999 23:33:57 -0000 1.1
--- regpy.py 29 Aug 2008 06:16:42 -0000 1.1.4.1
***************
*** 1,5 ****
# (sort-of) Registry editor
import win32ui
! import dialog
import win32con
import commctrl
--- 1,5 ----
# (sort-of) Registry editor
import win32ui
! from pywin.mfc import dialog
import win32con
import commctrl
***************
*** 46,50 ****
self.HookMessage(self.OnActivate, win32con.WM_ACTIVATE)
def OnActivate(self, msg):
! print "OnAcivate"
def t():
--- 46,50 ----
self.HookMessage(self.OnActivate, win32con.WM_ACTIVATE)
def OnActivate(self, msg):
! print("OnAcivate")
def t():
***************
*** 52,53 ****
--- 52,56 ----
ps.AddPage(RegistryPage())
ps.DoModal()
+
+ if __name__=='__main__':
+ t()
Index: hierlist.py
===================================================================
RCS file: /cvsroot/pywin32/pywin32/Pythonwin/pywin/tools/hierlist.py,v
retrieving revision 1.7
retrieving revision 1.7.2.1
diff -C2 -d -r1.7 -r1.7.2.1
*** hierlist.py 1 Jul 2008 01:23:51 -0000 1.7
--- hierlist.py 29 Aug 2008 06:16:42 -0000 1.7.2.1
***************
*** 14,18 ****
# to provide maximum flexibility (but with extra work).
!
import win32ui
import win32con
--- 14,18 ----
# to provide maximum flexibility (but with extra work).
! import sys
import win32ui
import win32con
***************
*** 49,53 ****
class HierList(object.Object):
def __init__(self, root, bitmapID = win32ui.IDB_HIERFOLDERS, listBoxId = None, bitmapMask = None): # used to create object.
! self.list = None
self.bitmapID = bitmapID
self.root = root
--- 49,53 ----
class HierList(object.Object):
def __init__(self, root, bitmapID = win32ui.IDB_HIERFOLDERS, listBoxId = None, bitmapMask = None): # used to create object.
! self.listControl = None
self.bitmapID = bitmapID
self.root = root
***************
*** 56,67 ****
self.filledItemHandlesMap = {}
self.bitmapMask = bitmapMask
def __getattr__(self, attr):
! l = self.__dict__['list']
! if l is not None:
! return getattr(l, attr)
def ItemFromHandle(self, handle):
return self.itemHandleMap[handle]
def SetStyle(self, newStyle):
! hwnd = self.list.GetSafeHwnd()
style = win32api.GetWindowLong(hwnd, win32con.GWL_STYLE);
win32api.SetWindowLong(hwnd, win32con.GWL_STYLE, (style | newStyle) )
--- 56,70 ----
self.filledItemHandlesMap = {}
self.bitmapMask = bitmapMask
+
def __getattr__(self, attr):
! try:
! return getattr(self.listControl, attr)
! except AttributeError:
! return getattr(self, attr)
!
def ItemFromHandle(self, handle):
return self.itemHandleMap[handle]
def SetStyle(self, newStyle):
! hwnd = self.listControl.GetSafeHwnd()
style = win32api.GetWindowLong(hwnd, win32con.GWL_STYLE);
win32api.SetWindowLong(hwnd, win32con.GWL_STYLE, (style | newStyle) )
***************
*** 77,90 ****
if listControl is None:
if self.listBoxId is None: self.listBoxId = win32ui.IDC_LIST1
! self.list = parent.GetDlgItem(self.listBoxId)
else:
! self.list = listControl
lbid = listControl.GetDlgCtrlID()
assert self.listBoxId is None or self.listBoxId == lbid, "An invalid listbox control ID has been specified (specified as %s, but exists as %s)" % (self.listBoxId, lbid)
self.listBoxId = lbid
! self.list.SetImageList(self.imageList, commctrl.LVSIL_NORMAL)
# self.list.AttachObject(self)
! parent.HookNotify(self.OnTreeItemExpanding, commctrl.TVN_ITEMEXPANDING)
! parent.HookNotify(self.OnTreeItemSelChanged, commctrl.TVN_SELCHANGED)
parent.HookNotify(self.OnTreeItemDoubleClick, commctrl.NM_DBLCLK)
self.notify_parent = parent
--- 80,100 ----
if listControl is None:
if self.listBoxId is None: self.listBoxId = win32ui.IDC_LIST1
! self.listControl = parent.GetDlgItem(self.listBoxId)
else:
! self.listControl = listControl
lbid = listControl.GetDlgCtrlID()
assert self.listBoxId is None or self.listBoxId == lbid, "An invalid listbox control ID has been specified (specified as %s, but exists as %s)" % (self.listBoxId, lbid)
self.listBoxId = lbid
! self.listControl.SetImageList(self.imageList, commctrl.LVSIL_NORMAL)
# self.list.AttachObject(self)
!
! ## ??? Need a better way to do this - either some way to detect if it's compiled with UNICODE
! ## defined, and/or a way to switch the constants based on UNICODE ???
! if sys.version_info[0] < 3:
! parent.HookNotify(self.OnTreeItemExpanding, commctrl.TVN_ITEMEXPANDINGA)
! parent.HookNotify(self.OnTreeItemSelChanged, commctrl.TVN_SELCHANGEDA)
! else:
! parent.HookNotify(self.OnTreeItemExpanding, commctrl.TVN_ITEMEXPANDINGW)
! parent.HookNotify(self.OnTreeItemSelChanged, commctrl.TVN_SELCHANGEDW)
parent.HookNotify(self.OnTreeItemDoubleClick, commctrl.NM_DBLCLK)
self.notify_parent = parent
***************
*** 94,98 ****
def DeleteAllItems(self):
! self.list.DeleteAllItems()
self.root = None
self.itemHandleMap = {}
--- 104,108 ----
def DeleteAllItems(self):
! self.listControl.DeleteAllItems()
self.root = None
self.itemHandleMap = {}
***************
*** 102,123 ****
# Dont want notifies as we kill the list.
parent = self.notify_parent # GetParentFrame()
! parent.HookNotify(None, commctrl.TVN_ITEMEXPANDING)
! parent.HookNotify(None, commctrl.TVN_SELCHANGED)
parent.HookNotify(None, commctrl.NM_DBLCLK)
self.DeleteAllItems()
! self.list = None
self.notify_parent = None # Break a possible cycle
! def OnTreeItemDoubleClick(self,(hwndFrom, idFrom, code), extra):
if idFrom != self.listBoxId: return None
! item = self.itemHandleMap[self.list.GetSelectedItem()]
self.TakeDefaultAction(item)
return 1
! def OnTreeItemExpanding(self,(hwndFrom, idFrom, code), extra):
if idFrom != self.listBoxId: return None
action, itemOld, itemNew, pt = extra
itemHandle = itemNew[0]
! if not self.filledItemHandlesMap.has_key(itemHandle):
item = self.itemHandleMap[itemHandle]
self.AddSubList(itemHandle, self.GetSubList(item))
--- 112,140 ----
# Dont want notifies as we kill the list.
parent = self.notify_parent # GetParentFrame()
! if sys.version_info[0] < 3:
! parent.HookNotify(None, commctrl.TVN_ITEMEXPANDINGA)
! parent.HookNotify(None, commctrl.TVN_SELCHANGEDA)
! else:
! parent.HookNotify(None, commctrl.TVN_ITEMEXPANDINGW)
! parent.HookNotify(None, commctrl.TVN_SELCHANGEDW)
parent.HookNotify(None, commctrl.NM_DBLCLK)
+
self.DeleteAllItems()
! self.listControl = None
self.notify_parent = None # Break a possible cycle
! def OnTreeItemDoubleClick(self, xxx_todo_changeme, extra):
! (hwndFrom, idFrom, code) = xxx_todo_changeme
if idFrom != self.listBoxId: return None
! item = self.itemHandleMap[self.listControl.GetSelectedItem()]
self.TakeDefaultAction(item)
return 1
! def OnTreeItemExpanding(self, xxx_todo_changeme1, extra):
! (hwndFrom, idFrom, code) = xxx_todo_changeme1
if idFrom != self.listBoxId: return None
action, itemOld, itemNew, pt = extra
itemHandle = itemNew[0]
! if itemHandle not in self.filledItemHandlesMap:
item = self.itemHandleMap[itemHandle]
self.AddSubList(itemHandle, self.GetSubList(item))
***************
*** 125,129 ****
return 0
! def OnTreeItemSelChanged(self,(hwndFrom, idFrom, code), extra):
if idFrom != self.listBoxId: return None
action, itemOld, itemNew, pt = extra
--- 142,147 ----
return 0
! def OnTreeItemSelChanged(self, xxx_todo_changeme2, extra):
! (hwndFrom, idFrom, code) = xxx_todo_changeme2
if idFrom != self.listBoxId: return None
action, itemOld, itemNew, pt = extra
***************
*** 146,152 ****
bitmapSel = self.GetSelectedBitmapColumn(item)
if bitmapSel is None: bitmapSel = bitmapCol
! if type(text) is unicode:
! text = text.encode("mbcs")
! hitem = self.list.InsertItem(parentHandle, hInsertAfter, (None, None, None, text, bitmapCol, bitmapSel, cItems, 0))
self.itemHandleMap[hitem] = item
return hitem
--- 164,170 ----
bitmapSel = self.GetSelectedBitmapColumn(item)
if bitmapSel is None: bitmapSel = bitmapCol
! ## if type(text) is str:
! ## text = text.encode("mbcs")
! hitem = self.listControl.InsertItem(parentHandle, hInsertAfter, (None, None, None, text, bitmapCol, bitmapSel, cItems, 0))
self.itemHandleMap[hitem] = item
return hitem
***************
*** 155,162 ****
ret = []
try:
! handle = self.list.GetChildItem(handle)
while 1:
ret.append(handle)
! handle = self.list.GetNextItem(handle, commctrl.TVGN_NEXT)
except win32ui.error:
# out of children
--- 173,180 ----
ret = []
try:
! handle = self.listControl.GetChildItem(handle)
while 1:
ret.append(handle)
! handle = self.listControl.GetNextItem(handle, commctrl.TVGN_NEXT)
except win32ui.error:
# out of children
***************
*** 170,179 ****
# (ie, the selected item, expanded items, etc)
if hparent is None: hparent = commctrl.TVI_ROOT
! if not self.filledItemHandlesMap.has_key(hparent):
# This item has never been expanded, so no refresh can possibly be required.
return
root_item = self.itemHandleMap[hparent]
old_handles = self._GetChildHandles(hparent)
! old_items = map( self.ItemFromHandle, old_handles )
new_items = self.GetSubList(root_item)
# Now an inefficient technique for synching the items.
--- 188,197 ----
# (ie, the selected item, expanded items, etc)
if hparent is None: hparent = commctrl.TVI_ROOT
! if hparent not in self.filledItemHandlesMap:
# This item has never been expanded, so no refresh can possibly be required.
return
root_item = self.itemHandleMap[hparent]
old_handles = self._GetChildHandles(hparent)
! old_items = list(map( self.ItemFromHandle, old_handles ))
new_items = self.GetSubList(root_item)
# Now an inefficient technique for synching the items.
***************
*** 198,202 ****
# And recursively refresh iold
hold = old_handles[iold]
! if self.filledItemHandlesMap.has_key(hold):
self.Refresh(hold)
else:
--- 216,220 ----
# And recursively refresh iold
hold = old_handles[iold]
! if hold in self.filledItemHandlesMap:
self.Refresh(hold)
else:
***************
*** 207,213 ****
for hchild in self._GetChildHandles(hdelete):
del self.itemHandleMap[hchild]
! if self.filledItemHandlesMap.has_key(hchild):
del self.filledItemHandlesMap[hchild]
! self.list.DeleteItem(hdelete)
hAfter = old_handles[iold]
# Fill any remaining new items:
--- 225,231 ----
for hchild in self._GetChildHandles(hdelete):
del self.itemHandleMap[hchild]
! if hchild in self.filledItemHandlesMap:
del self.filledItemHandlesMap[hchild]
! self.listControl.DeleteItem(hdelete)
hAfter = old_handles[iold]
# Fill any remaining new items:
***************
*** 216,220 ****
self.AddItem(hparent, newItem)
def AcceptRoot(self, root):
! self.list.DeleteAllItems()
self.itemHandleMap = {commctrl.TVI_ROOT : root}
self.filledItemHandlesMap = {commctrl.TVI_ROOT : root}
--- 234,238 ----
self.AddItem(hparent, newItem)
def AcceptRoot(self, root):
! self.listControl.DeleteAllItems()
self.itemHandleMap = {commctrl.TVI_ROOT : root}
self.filledItemHandlesMap = {commctrl.TVI_ROOT : root}
***************
*** 234,238 ****
def CheckChangedChildren(self):
! return self.list.CheckChangedChildren()
def GetText(self,item):
return GetItemText(item)
--- 252,256 ----
def CheckChangedChildren(self):
! return self.listControl.CheckChangedChildren()
def GetText(self,item):
return GetItemText(item)
Index: browser.py
===================================================================
RCS file: /cvsroot/pywin32/pywin32/Pythonwin/pywin/tools/browser.py,v
retrieving revision 1.10
retrieving revision 1.10.2.1
diff -C2 -d -r1.10 -r1.10.2.1
*** browser.py 9 Aug 2008 16:47:08 -0000 1.10
--- browser.py 29 Aug 2008 06:16:42 -0000 1.10.2.1
***************
*** 10,15 ****
import win32ui
from pywin.mfc import dialog
!
! import hierlist
from types import *
--- 10,14 ----
import win32ui
from pywin.mfc import dialog
! from . import hierlist
from types import *
***************
*** 66,70 ****
ret = []
try:
! for (key, ob) in self.myobject.__dict__.items():
if key not in special_names:
ret.append(MakeHLI( ob, key ) )
--- 65,69 ----
ret = []
try:
! for (key, ob) in list(self.myobject.__dict__.items()):
if key not in special_names:
ret.append(MakeHLI( ob, key ) )
***************
*** 95,99 ****
return 1
try:
! for key in self.myobject.__dict__.keys():
if key not in special_names:
return 1
--- 94,98 ----
return 1
try:
! for key in list(self.myobject.__dict__.keys()):
if key not in special_names:
return 1
***************
*** 205,210 ****
except AttributeError:
pass
! ret.append( MakeHLI( self.myobject.func_code, "Code" ))
! ret.append( MakeHLI( self.myobject.func_globals, "Globals" ))
self.InsertDocString(ret)
return ret
--- 204,209 ----
except AttributeError:
pass
! ret.append( MakeHLI( self.myobject.__code__, "Code" ))
! ret.append( MakeHLI( self.myobject.__globals__, "Globals" ))
self.InsertDocString(ret)
return ret
***************
*** 243,247 ****
def GetSubList(self):
ret = []
! keys = self.myobject.keys()
keys.sort()
for key in keys:
--- 242,246 ----
def GetSubList(self):
ret = []
! keys = list(self.myobject.keys())
keys.sort()
for key in keys:
***************
*** 256,274 ****
return 0
! TypeMap = { ClassType : HLIClass,
FunctionType: HLIFunction,
! TupleType: HLITuple,
! DictType: HLIDict,
! ListType: HLIList,
ModuleType: HLIModule,
! InstanceType : HLIInstance,
CodeType : HLICode,
BuiltinFunctionType : HLIBuiltinFunction,
FrameType : HLIFrame,
TracebackType : HLITraceback,
! StringType : HLIString,
! IntType: HLIPythonObject,
! LongType: HLIPythonObject,
! FloatType: HLIPythonObject,
}
try:
--- 255,273 ----
return 0
! TypeMap = { type : HLIClass,
FunctionType: HLIFunction,
! tuple: HLITuple,
! dict: HLIDict,
! list: HLIList,
ModuleType: HLIModule,
! ## InstanceType : HLIInstance,
CodeType : HLICode,
BuiltinFunctionType : HLIBuiltinFunction,
FrameType : HLIFrame,
TracebackType : HLITraceback,
! str : HLIString,
! int: HLIPythonObject,
! ## LongType: HLIPythonObject,
! float: HLIPythonObject,
}
try:
***************
*** 365,369 ****
root = MakeHLI (ob, 'root')
if not root.IsExpandable():
! raise TypeError, "Browse() argument must have __dict__ attribute, or be a Browser supported type"
dlg = dynamic_browser (root)
--- 364,368 ----
root = MakeHLI (ob, 'root')
if not root.IsExpandable():
! raise TypeError("Browse() argument must have __dict__ attribute, or be a Browser supported type")
dlg = dynamic_browser (root)
***************
*** 398,402 ****
self.SetTitle("Browser: " + root.name)
def OnOpenDocument (self, name):
! raise TypeError, "This template can not open files"
return 0
--- 397,401 ----
self.SetTitle("Browser: " + root.name)
def OnOpenDocument (self, name):
! raise TypeError("This template can not open files")
return 0
***************
*** 423,427 ****
root = MakeHLI(ob, repr(ob))
if not root.IsExpandable():
! raise TypeError, "Browse() argument must have __dict__ attribute, or be a Browser supported type"
template.OpenObject(root)
--- 422,426 ----
root = MakeHLI(ob, repr(ob))
if not root.IsExpandable():
! raise TypeError("Browse() argument must have __dict__ attribute, or be a Browser supported type")
template.OpenObject(root)
Index: regedit.py
===================================================================
RCS file: /cvsroot/pywin32/pywin32/Pythonwin/pywin/tools/regedit.py,v
retrieving revision 1.2
retrieving revision 1.2.4.1
diff -C2 -d -r1.2 -r1.2.4.1
*** regedit.py 9 Oct 1999 23:43:46 -0000 1.2
--- regedit.py 29 Aug 2008 06:16:42 -0000 1.2.4.1
***************
*** 2,6 ****
import win32api, win32ui, win32con, commctrl
from pywin.mfc import window, docview, dialog
! import hierlist
import regutil
import string
--- 2,6 ----
import win32api, win32ui, win32con, commctrl
from pywin.mfc import window, docview, dialog
! from . import hierlist
import regutil
import string
***************
*** 8,14 ****
def SafeApply( fn, args, err_desc = "" ):
try:
! apply(fn, args)
return 1
! except win32api.error, (rc, fn, msg):
msg = "Error " + err_desc + "\r\n\r\n" + msg
win32ui.MessageBox(msg)
--- 8,15 ----
def SafeApply( fn, args, err_desc = "" ):
try:
! fn(*args)
return 1
! except win32api.error as xxx_todo_changeme:
! (rc, fn, msg) = xxx_todo_changeme.args
msg = "Error " + err_desc + "\r\n\r\n" + msg
win32ui.MessageBox(msg)
***************
*** 41,45 ****
return 1
! def OnItemDoubleClick(self,(hwndFrom, idFrom, code), extra):
if idFrom==win32ui.AFX_IDW_PANE_FIRST:
# Tree control
--- 42,47 ----
return 1
! def OnItemDoubleClick(self, xxx_todo_changeme1, extra):
! (hwndFrom, idFrom, code) = xxx_todo_changeme1
if idFrom==win32ui.AFX_IDW_PANE_FIRST:
# Tree control
***************
*** 210,214 ****
try:
newVal = self.GetItemsCurrentValue(item, keyVal)
! except TypeError, details:
win32ui.MessageBox(details)
return
--- 212,216 ----
try:
newVal = self.GetItemsCurrentValue(item, keyVal)
! except TypeError as details:
win32ui.MessageBox(details)
return
***************
*** 218,222 ****
try:
self.SetItemsCurrentValue(item, keyVal, d.newvalue)
! except win32api.error, (rc, fn, desc):
win32ui.MessageBox("Error setting value\r\n\n%s" % desc)
self.UpdateForRegItem(item)
--- 220,225 ----
try:
self.SetItemsCurrentValue(item, keyVal, d.newvalue)
! except win32api.error as xxx_todo_changeme2:
! (rc, fn, desc) = xxx_todo_changeme2.args
win32ui.MessageBox("Error setting value\r\n\n%s" % desc)
self.UpdateForRegItem(item)
***************
*** 227,231 ****
val, type = win32api.RegQueryValueEx(hkey, valueName)
if type != win32con.REG_SZ:
! raise TypeError, "Only strings can be edited"
return val
finally:
--- 230,234 ----
val, type = win32api.RegQueryValueEx(hkey, valueName)
if type != win32con.REG_SZ:
! raise TypeError("Only strings can be edited")
return val
finally:
***************
*** 272,276 ****
def OnOpenDocument (self, name):
! raise TypeError, "This template can not open files"
return 0
--- 275,279 ----
def OnOpenDocument (self, name):
! raise TypeError("This template can not open files")
return 0
Index: browseProjects.py
===================================================================
RCS file: /cvsroot/pywin32/pywin32/Pythonwin/pywin/tools/browseProjects.py,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -C2 -d -r1.3 -r1.3.2.1
*** browseProjects.py 9 Aug 2008 16:47:08 -0000 1.3
--- browseProjects.py 29 Aug 2008 06:16:42 -0000 1.3.2.1
***************
*** 57,61 ****
for c in self.super:
ret.append(HLICLBRClass(c, " (Parent class)"))
! for meth, lineno in self.methods.items():
ret.append(HLICLBRMethod(meth, self.file, lineno, " (method)"))
return ret
--- 57,61 ----
for c in self.super:
ret.append(HLICLBRClass(c, " (Parent class)"))
! for meth, lineno in list(self.methods.items()):
ret.append(HLICLBRMethod(meth, self.file, lineno, " (method)"))
return ret
***************
*** 104,108 ****
if data:
ret = []
! for item in data.values():
if item.__class__ != pyclbr.Class: # ie, it is a pyclbr Function instance (only introduced post 1.5.2)
ret.append(HLICLBRFunction( item, " (function)" ) )
--- 104,108 ----
if data:
ret = []
! for item in list(data.values()):
if item.__class__ != pyclbr.Class: # ie, it is a pyclbr Function instance (only introduced post 1.5.2)
ret.append(HLICLBRFunction( item, " (function)" ) )
***************
*** 166,170 ****
ret = MakePathSubList(pathList[0])
else:
! ret = map( HLIDirectoryItem, pathList )
return ret
--- 166,170 ----
ret = MakePathSubList(pathList[0])
else:
! ret = list(map( HLIDirectoryItem, pathList ))
return ret
***************
*** 227,231 ****
root = HLIRoot()
if not root.IsExpandable():
! raise TypeError, "Browse() argument must have __dict__ attribute, or be a Browser supported type"
dlg = dynamic_browser (root)
--- 227,231 ----
root = HLIRoot()
if not root.IsExpandable():
! raise TypeError("Browse() argument must have __dict__ attribute, or be a Browser supported type")
dlg = dynamic_browser (root)
|