diff --git a/demo/agw/MacLargeDemo.py b/demo/agw/MacLargeDemo.py
index 7cc69ce8..4d967a54 100644
--- a/demo/agw/MacLargeDemo.py
+++ b/demo/agw/MacLargeDemo.py
@@ -308,8 +308,8 @@ class UltimateListCtrlPanel(wx.Panel):
self.list.InsertColumnInfo(1, info)
- for i in xrange(2):
- index = self.list.InsertImageStringItem(sys.maxint, "", [i])
+ for i in range(2):
+ index = self.list.InsertImageStringItem(sys.maxsize, "", [i])
self.list.SetStringItem(index, 1, "")
klass = MacRenderer(self)
self.list.SetItemCustomRenderer(index, 1, klass)
diff --git a/demo/agw/ShortcutEditor.py b/demo/agw/ShortcutEditor.py
index 933269e2..be268fd4 100644
--- a/demo/agw/ShortcutEditor.py
+++ b/demo/agw/ShortcutEditor.py
@@ -31,9 +31,9 @@ HTML_HELP = os.path.join(SE_DIR, 'data', 'default_help_text.html')
TOP_MENUS = ['File', 'Edit', 'View', 'Options', 'Window', 'Help']
COMBINATIONS = string.ascii_uppercase + string.digits
-COMBINATIONS = [c for c in COMBINATIONS] + SE.KEYMAP.values()
+COMBINATIONS = [c for c in COMBINATIONS] + list(SE.KEYMAP.values())
-ACCEL_IDS = [wx.NewId() for i in xrange(6)]
+ACCEL_IDS = [wx.NewId() for i in range(6)]
_ = wx.GetTranslation
@@ -202,9 +202,9 @@ class ShortcutEditorDemo(wx.Frame):
table = []
saved_table = []
- for i in xrange(6):
+ for i in range(6):
name = 'Accelerator %d'%(i+1)
- choice = random.choice(SE.ACCELERATORS.keys())
+ choice = random.choice(list(SE.ACCELERATORS.keys()))
if choice == wx.ACCEL_ALT:
letter = random.choice(COMBINATIONS)
@@ -216,7 +216,7 @@ class ShortcutEditorDemo(wx.Frame):
wxk = ord(letter)
else:
- wxk = random.choice(SE.KEYMAP.keys())
+ wxk = random.choice(list(SE.KEYMAP.keys()))
accel = (choice, wxk, ACCEL_IDS[i])
saved_accel = (name, choice, wxk, ACCEL_IDS[i])
@@ -234,7 +234,7 @@ class ShortcutEditorDemo(wx.Frame):
num_menus = random.randint(2, 7)
- for index in xrange(num_menus):
+ for index in range(num_menus):
shortcut = self.CreateShortcut()
sub_menu = wx.MenuItem(top_menu, -1, '%s%sItem %d%s'%(recursive, title, index+1, shortcut),
diff --git a/demo/agw/UltimateListCtrl.py b/demo/agw/UltimateListCtrl.py
index 6b6b1820..60e963a5 100644
--- a/demo/agw/UltimateListCtrl.py
+++ b/demo/agw/UltimateListCtrl.py
@@ -37,7 +37,7 @@ class ButtonPanel(wx.Panel):
box = wx.BoxSizer(wx.VERTICAL)
box.Add((20, 20))
- keys = buttonDefs.keys()
+ keys = list(buttonDefs.keys())
keys.sort()
for k in keys:
diff --git a/demo/agw/UltimateListIconDemo.py b/demo/agw/UltimateListIconDemo.py
index cafaf979..cc2dcd6c 100644
--- a/demo/agw/UltimateListIconDemo.py
+++ b/demo/agw/UltimateListIconDemo.py
@@ -850,7 +850,7 @@ class TestFrame(wx.Frame):
# load some images into an image list
il = wx.ImageList(64, 64, True)
- imgs = catalog.keys()
+ imgs = list(catalog.keys())
imgs.sort()
for img in imgs:
@@ -886,7 +886,7 @@ class TestFrame(wx.Frame):
self.list.InsertColumnInfo(2, info)
- for i in xrange(3):
+ for i in range(3):
self.list.SetColumnWidth(i, 130)
# create some items for the list
diff --git a/demo/agw/UltimateListListDemo.py b/demo/agw/UltimateListListDemo.py
index eca057d6..af78622b 100644
--- a/demo/agw/UltimateListListDemo.py
+++ b/demo/agw/UltimateListListDemo.py
@@ -89,7 +89,7 @@ class TestFrame(wx.Frame):
# load some images into an image list
il = wx.ImageList(16, 16, True)
- imgs = catalog.keys()
+ imgs = list(catalog.keys())
imgs.sort()
for img in imgs:
diff --git a/demo/agw/UltimateReportDemo.py b/demo/agw/UltimateReportDemo.py
index 332f6d07..2b08ca19 100644
--- a/demo/agw/UltimateReportDemo.py
+++ b/demo/agw/UltimateReportDemo.py
@@ -570,12 +570,12 @@ class UltimateListCtrlPanel(wx.Panel, listmix.ColumnSorterMixin):
for key, data in items:
if key == 3:
- index = self.list.InsertImageStringItem(sys.maxint, data[0], [3, 4, 7], it_kind=1)
+ index = self.list.InsertImageStringItem(sys.maxsize, data[0], [3, 4, 7], it_kind=1)
elif key == 4:
dt = "\n".join(data[0].split())
- index = self.list.InsertImageStringItem(sys.maxint, dt, [self.idx1, 8, 7])
+ index = self.list.InsertImageStringItem(sys.maxsize, dt, [self.idx1, 8, 7])
else:
- index = self.list.InsertImageStringItem(sys.maxint, data[0], self.idx1)
+ index = self.list.InsertImageStringItem(sys.maxsize, data[0], self.idx1)
if key == 6:
self.list.SetStringItem(index, 1, data[1], it_kind=1)
@@ -679,8 +679,8 @@ class UltimateListCtrlPanel(wx.Panel, listmix.ColumnSorterMixin):
lenCDB = len(self.colourList)
- for indx in xrange(11, 20):
- for col in xrange(self.list.GetColumnCount()):
+ for indx in range(11, 20):
+ for col in range(self.list.GetColumnCount()):
result = random.randint(0, 2)
colourIndex = random.randint(0, lenCDB-1)
diff --git a/demo/agw/UltimateVirtualDemo.py b/demo/agw/UltimateVirtualDemo.py
index a8424db1..1918b37a 100644
--- a/demo/agw/UltimateVirtualDemo.py
+++ b/demo/agw/UltimateVirtualDemo.py
@@ -28,7 +28,7 @@ def GenerateRandomList(imgList):
numImages = random.randint(1, 3)
listSize = imgList.GetImageCount()
- for i in xrange(numImages):
+ for i in range(numImages):
rList.append(random.randint(0, listSize-1))
return rList
@@ -79,7 +79,7 @@ class TestUltimateListCtrl(ULC.UltimateListCtrl):
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected)
- self.randomLists = [GenerateRandomList(self.il) for i in xrange(5)]
+ self.randomLists = [GenerateRandomList(self.il) for i in range(5)]
def OnItemSelected(self, event):
diff --git a/demo/agw/Windows7Explorer_Contents.py b/demo/agw/Windows7Explorer_Contents.py
index 8e707f8e..e742e113 100644
--- a/demo/agw/Windows7Explorer_Contents.py
+++ b/demo/agw/Windows7Explorer_Contents.py
@@ -3,6 +3,7 @@
import sys
import os
import wx
+import wx.lib.six as six
import time
import datetime
import operator
@@ -29,8 +30,9 @@ sys.path.append(os.path.split(dirName)[0])
# helper function to make sure we don't convert unicode objects to strings
# or vice versa when converting lists and None values to text.
convert = str
-if 'unicode' in wx.PlatformInfo:
- convert = unicode
+if six.PY2:
+ if 'unicode' in wx.PlatformInfo:
+ convert = unicode
def FormatFileSize(size):
@@ -282,7 +284,7 @@ class Windows7Explorer(ULC.UltimateListCtrl):
dummy_log = wx.LogNull()
for kind, file, lower in files:
- index = self.InsertStringItem(sys.maxint, "")
+ index = self.InsertStringItem(sys.maxsize, "")
klass = FirstColumnRenderer(self, file)
self.SetItemCustomRenderer(index, 0, klass)
diff --git a/demo/agw/XLSGrid.py b/demo/agw/XLSGrid.py
index c909d8b6..365c2258 100644
--- a/demo/agw/XLSGrid.py
+++ b/demo/agw/XLSGrid.py
@@ -19,7 +19,7 @@ try:
_isStandalone = True
except ImportError: # if it's not there locally, try the wxPython lib.
import wx.lib.agw.xlsgrid as XG
- dataDir = os.path.join(dirName, "agw", "data")
+ dataDir = os.path.join(dirName, "data")
_hasXLRD = True
@@ -81,24 +81,24 @@ class XLSGridFrame(wx.Frame):
item = wx.MenuItem(fileMenu, wx.ID_ANY, "E&xit", "Exit XLSGrid demo")
self.Bind(wx.EVT_MENU, self.OnClose, item)
- fileMenu.AppendItem(item)
+ fileMenu.Append(item)
item = wx.MenuItem(helpMenu, wx.ID_ANY, "About...", "Shows the about dialog")
self.Bind(wx.EVT_MENU, self.OnAbout, item)
- helpMenu.AppendItem(item)
+ helpMenu.Append(item)
menuBar.Append(fileMenu, "&File")
menuBar.Append(helpMenu, "&Help")
self.SetMenuBar(menuBar)
- statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
+ statusbar = self.CreateStatusBar(2, wx.STB_SIZEGRIP)
statusbar.SetStatusWidths([-2, -1])
statusbar_fields = [("wxPython XLSGrid Demo, Andrea Gavana @ 08 Aug 2011"),
("Welcome To wxPython!")]
- for i in xrange(len(statusbar_fields)):
+ for i in range(len(statusbar_fields)):
statusbar.SetStatusText(statusbar_fields[i], i)
diff --git a/unittests/test_lib_agw_shortcuteditor.py b/unittests/test_lib_agw_shortcuteditor.py
new file mode 100644
index 00000000..7db2ecef
--- /dev/null
+++ b/unittests/test_lib_agw_shortcuteditor.py
@@ -0,0 +1,22 @@
+import imp_unittest, unittest
+import wtc
+import wx
+import os
+
+import wx.lib.agw.shortcuteditor as SE
+#---------------------------------------------------------------------------
+
+class lib_agw_shortcuteditor_Tests(wtc.WidgetTestCase):
+
+ def test_lib_agw_rulerctrlCtor(self):
+ dlg = SE.ShortcutEditor(self.frame)
+
+ def test_lib_agw_shortcuteditorEvents(self):
+ SE.EVT_SHORTCUT_CHANGING
+ SE.EVT_SHORTCUT_CHANGED
+
+#---------------------------------------------------------------------------
+
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file
diff --git a/unittests/test_lib_agw_supertooltip.py b/unittests/test_lib_agw_supertooltip.py
new file mode 100644
index 00000000..6995d44b
--- /dev/null
+++ b/unittests/test_lib_agw_supertooltip.py
@@ -0,0 +1,18 @@
+import imp_unittest, unittest
+import wtc
+import wx
+
+import wx.lib.agw.supertooltip as STT
+
+#---------------------------------------------------------------------------
+
+class lib_agw_supertooltip_Tests(wtc.WidgetTestCase):
+
+ def test_lib_agw_supertooltipCtor(self):
+ STT.SuperToolTip("a simple test message")
+
+
+#---------------------------------------------------------------------------
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/unittests/test_lib_agw_thumbnailctrl.py b/unittests/test_lib_agw_thumbnailctrl.py
new file mode 100644
index 00000000..2abdf296
--- /dev/null
+++ b/unittests/test_lib_agw_thumbnailctrl.py
@@ -0,0 +1,24 @@
+import imp_unittest, unittest
+import wtc
+import wx
+
+import wx.lib.agw.thumbnailctrl as TNC
+
+#---------------------------------------------------------------------------
+
+class lib_agw_thumbnailctrl_Tests(wtc.WidgetTestCase):
+
+ def test_lib_agw_thumbnailctrlCtor(self):
+ tnc = TNC.ThumbnailCtrl(self.frame, -1, imagehandler=TNC.NativeImageHandler)
+
+ def test_lib_agw_thumbnailctrlEvents(self):
+ TNC.EVT_THUMBNAILS_CAPTION_CHANGED
+ TNC.EVT_THUMBNAILS_DCLICK
+ TNC.EVT_THUMBNAILS_POINTED
+ TNC.EVT_THUMBNAILS_SEL_CHANGED
+ TNC.EVT_THUMBNAILS_THUMB_CHANGED
+
+#---------------------------------------------------------------------------
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/unittests/test_lib_agw_toasterbox.py b/unittests/test_lib_agw_toasterbox.py
new file mode 100644
index 00000000..d842ba12
--- /dev/null
+++ b/unittests/test_lib_agw_toasterbox.py
@@ -0,0 +1,37 @@
+import imp_unittest, unittest
+import wtc
+import wx
+
+import wx.lib.agw.toasterbox as TB
+
+#---------------------------------------------------------------------------
+
+class lib_agw_toasterbox_Tests(wtc.WidgetTestCase):
+
+ def test_lib_agw_toasterboxCtor(self):
+ windowstyle = TB.TB_CAPTION
+ tbstyle = TB.TB_COMPLEX
+ closingstyle = TB.TB_ONCLICK
+
+ tb = TB.ToasterBox(self.frame, tbstyle, windowstyle, closingstyle,
+ scrollType=TB.TB_SCR_TYPE_FADE)
+ tb.Play()
+
+
+ def test_lib_agw_thumbnailctrlStyles(self):
+ TB.TB_SIMPLE
+ TB.TB_COMPLEX
+ TB.TB_ONTIME
+ TB.TB_ONCLICK
+ TB.TB_DEFAULT_STYLE
+ TB.TB_CAPTION
+ TB.TB_SCR_TYPE_UD
+ TB.TB_SCR_TYPE_DU
+ TB.TB_SCR_TYPE_FADE
+
+
+
+#---------------------------------------------------------------------------
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/unittests/test_lib_agw_ultimatelistctrl.py b/unittests/test_lib_agw_ultimatelistctrl.py
new file mode 100644
index 00000000..5448bf2b
--- /dev/null
+++ b/unittests/test_lib_agw_ultimatelistctrl.py
@@ -0,0 +1,95 @@
+import imp_unittest, unittest
+import wtc
+import wx
+
+import wx.lib.agw.ultimatelistctrl as ULC
+
+#---------------------------------------------------------------------------
+
+class lib_agw_ultimatelistctrl_Tests(wtc.WidgetTestCase):
+
+ def test_lib_agw_ultimatelistctrlCtorReport(self):
+ ulc = ULC.UltimateListCtrl(self.frame, agwStyle=wx.LC_REPORT)
+
+ def test_lib_agw_ultimatelistctrlCtorIcon(self):
+ ulc = ULC.UltimateListCtrl(self.frame, agwStyle=wx.LC_ICON)
+
+ def test_lib_agw_ultimatelistctrlCtorList(self):
+ ulc = ULC.UltimateListCtrl(self.frame, agwStyle=wx.LC_LIST)
+
+ def test_lib_agw_ultimatelistctrlCtorVirtual(self):
+ ulc = ULC.UltimateListCtrl(self.frame, agwStyle=wx.LC_REPORT|wx.LC_VIRTUAL)
+
+ def test_lib_agw_thumbnailctrlStyles(self):
+ ULC.ULC_VRULES
+ ULC.ULC_HRULES
+ ULC.ULC_ICON
+ ULC.ULC_SMALL_ICON
+ ULC.ULC_LIST
+ ULC.ULC_REPORT
+ ULC.ULC_ALIGN_TOP
+ ULC.ULC_ALIGN_LEFT
+ ULC.ULC_AUTOARRANGE
+ ULC.ULC_VIRTUAL
+ ULC.ULC_EDIT_LABELS
+ ULC.ULC_NO_HEADER
+ ULC.ULC_NO_SORT_HEADER
+ ULC.ULC_SINGLE_SEL
+ ULC.ULC_SORT_ASCENDING
+ ULC.ULC_SORT_DESCENDING
+ ULC.ULC_TILE
+ ULC.ULC_NO_HIGHLIGHT
+ ULC.ULC_STICKY_HIGHLIGHT
+ ULC.ULC_STICKY_NOSELEVENT
+ ULC.ULC_SEND_LEFTCLICK
+ ULC.ULC_HAS_VARIABLE_ROW_HEIGHT
+ ULC.ULC_AUTO_CHECK_CHILD
+ ULC.ULC_AUTO_TOGGLE_CHILD
+ ULC.ULC_AUTO_CHECK_PARENT
+ ULC.ULC_SHOW_TOOLTIPS
+ ULC.ULC_HOT_TRACKING
+ ULC.ULC_BORDER_SELECT
+ ULC.ULC_TRACK_SELECT
+ ULC.ULC_HEADER_IN_ALL_VIEWS
+ ULC.ULC_NO_FULL_ROW_SELECT
+ ULC.ULC_FOOTER
+ ULC.ULC_USER_ROW_HEIGHT
+
+ def test_lib_agw_ultimatelistctrlEvents(self):
+ wx.EVT_LIST_BEGIN_DRAG
+ wx.EVT_LIST_BEGIN_RDRAG
+ wx.EVT_LIST_BEGIN_LABEL_EDIT
+ wx.EVT_LIST_END_LABEL_EDIT
+ wx.EVT_LIST_DELETE_ITEM
+ wx.EVT_LIST_DELETE_ALL_ITEMS
+ wx.EVT_LIST_KEY_DOWN
+ wx.EVT_LIST_INSERT_ITEM
+ wx.EVT_LIST_COL_CLICK
+ wx.EVT_LIST_COL_RIGHT_CLICK
+ wx.EVT_LIST_COL_BEGIN_DRAG
+ wx.EVT_LIST_COL_END_DRAG
+ wx.EVT_LIST_COL_DRAGGING
+ wx.EVT_LIST_ITEM_SELECTED
+ wx.EVT_LIST_ITEM_DESELECTED
+ wx.EVT_LIST_ITEM_RIGHT_CLICK
+ wx.EVT_LIST_ITEM_MIDDLE_CLICK
+ wx.EVT_LIST_ITEM_ACTIVATED
+ wx.EVT_LIST_ITEM_FOCUSED
+ wx.EVT_LIST_CACHE_HINT
+ # in doc but does not exist???
+ #wx.EVT_LIST_ITEM_CHECKING
+ #wx.EVT_LIST_ITEM_CHECKED
+ #wx.EVT_LIST_COL_CHECKING
+ #wx.EVT_LIST_COL_CHECKED
+ #wx.EVT_LIST_FOOTER_CHECKING
+ #wx.EVT_LIST_FOOTER_CHECKED
+ #wx.EVT_LIST_ITEM_HYPERLINK
+ #wx.EVT_LIST_FOOTER_CLICK
+ #wx.EVT_LIST_FOOTER_RIGHT_CLICK
+ #wx.EVT_LIST_ITEM_LEFT_CLICK
+ #wx.EVT_LIST_END_DRAG
+
+#---------------------------------------------------------------------------
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/unittests/test_lib_agw_xlsgrid.py b/unittests/test_lib_agw_xlsgrid.py
new file mode 100644
index 00000000..728041fb
--- /dev/null
+++ b/unittests/test_lib_agw_xlsgrid.py
@@ -0,0 +1,22 @@
+import imp_unittest, unittest
+import wtc
+import wx
+
+try:
+ import wx.lib.agw.xlsgrid as XG
+ skipIt = False
+except:
+ skipIt = False
+
+#---------------------------------------------------------------------------
+
+class lib_agw_xlsgrid_Tests(wtc.WidgetTestCase):
+
+ @unittest.skipIf(skipIt, 'Requires xlrd')
+ def test_lib_agw_xlsgridCtor(self):
+ xg = XG.XLSGrid(self.frame)
+
+#---------------------------------------------------------------------------
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/unittests/test_lib_agw_zoombar.py b/unittests/test_lib_agw_zoombar.py
new file mode 100644
index 00000000..f9c68852
--- /dev/null
+++ b/unittests/test_lib_agw_zoombar.py
@@ -0,0 +1,21 @@
+import imp_unittest, unittest
+import wtc
+import wx
+
+import wx.lib.agw.zoombar as ZB
+
+#---------------------------------------------------------------------------
+
+class lib_agw_zoombar_Tests(wtc.WidgetTestCase):
+
+ def test_lib_agw_zoombarCtor(self):
+ zb = ZB.ZoomBar(self.frame)
+
+ def test_lib_agw_thumbnailctrlEvents(self):
+ ZB.EVT_ZOOMBAR
+
+
+#---------------------------------------------------------------------------
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/unittests/test_lib_fancytext.py b/unittests/test_lib_fancytext.py
new file mode 100644
index 00000000..3f38521f
--- /dev/null
+++ b/unittests/test_lib_fancytext.py
@@ -0,0 +1,32 @@
+import imp_unittest, unittest
+import wtc
+import wx
+
+import wx.lib.fancytext as FT
+
+#---------------------------------------------------------------------------
+test_str = (''
+ 'some |23 textwith subscript'
+ ' some other text')
+
+
+class lib_fancytext_Tests(wtc.WidgetTestCase):
+
+ def test_lib_fancytext_DateCtor(self):
+ sft = FT.StaticFancyText(self.frame, -1, "text to test", wx.Brush("light grey", wx.BRUSHSTYLE_SOLID))
+
+ def test_lib_fancytext_Methods(self):
+ self.frame.Bind(wx.EVT_PAINT, self.OnPaint)
+
+ FT.RenderToBitmap(test_str, background=None, enclose=True)
+
+ def OnPaint(self, evt):
+ dc = wx.PaintDC(self.frame)
+ FT.GetExtent(test_str, dc=dc, enclose=True)
+ FT.GetFullExtent(test_str, dc=dc, enclose=True)
+ FT.RenderToDC(test_str, dc, 0, 10, enclose=True)
+
+#---------------------------------------------------------------------------
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/unittests/test_lib_masked.py b/unittests/test_lib_masked.py
index 81f31480..a8b3d452 100644
--- a/unittests/test_lib_masked.py
+++ b/unittests/test_lib_masked.py
@@ -56,10 +56,11 @@ class MaskedTextCtrlTests(wtc.WidgetTestCase):
class MaskedNumCtrlTests(wtc.WidgetTestCase):
def test_numctrlCtor(self):
- t = m.NumCtrl(self.frame)
- t = m.NumCtrl(self.frame, -1, "10")
- t = m.NumCtrl(self.frame, style=wx.TE_READONLY)
-
+ t1 = m.NumCtrl(self.frame)
+ t2 = m.NumCtrl(self.frame, -1, "10")
+ t3 = m.NumCtrl(self.frame, value='32',style=wx.TE_READONLY, min=32, max=72)
+ t3.ChangeValue("16")
+ self.assertTrue(not t3.IsValid())
#def test_numctrlDefaultCtor(self):
#t = m.TextCtrl()
diff --git a/wx/lib/agw/shortcuteditor.py b/wx/lib/agw/shortcuteditor.py
index 64699042..6c512090 100644
--- a/wx/lib/agw/shortcuteditor.py
+++ b/wx/lib/agw/shortcuteditor.py
@@ -22,6 +22,7 @@
#
# Or, Obviously, To The wxPython Mailing List!!!
#
+# Tags: phoenix-port, unittest, documented, py3-port
#
# End Of Comments
# --------------------------------------------------------------------------------- #
diff --git a/wx/lib/agw/supertooltip.py b/wx/lib/agw/supertooltip.py
index 48fec3a5..6a9ae7f4 100644
--- a/wx/lib/agw/supertooltip.py
+++ b/wx/lib/agw/supertooltip.py
@@ -24,6 +24,7 @@
#
# Or, obviously, to the wxPython mailing list!!!
#
+# Tags: phoenix-port, documented, unittest, py3-port
#
# End Of Comments
# --------------------------------------------------------------------------------- #
diff --git a/wx/lib/agw/thumbnailctrl.py b/wx/lib/agw/thumbnailctrl.py
index 7938dfb0..3e8d43c6 100644
--- a/wx/lib/agw/thumbnailctrl.py
+++ b/wx/lib/agw/thumbnailctrl.py
@@ -26,7 +26,7 @@
#
# Or, Obviously, To The wxPython Mailing List!!!
#
-# Tags: phoenix-port
+# Tags: phoenix-port, documented, unittest, py3-port
#
# End Of Comments
# --------------------------------------------------------------------------- #
@@ -183,7 +183,7 @@ else:
def GetMondrianData():
""" Returns a default image placeholder as a decompressed stream of characters. """
return \
-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00 \x08\x06\x00\
+b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00 \x08\x06\x00\
\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00qID\
ATX\x85\xed\xd6;\n\x800\x10E\xd1{\xc5\x8d\xb9r\x97\x16\x0b\xad$\x8a\x82:\x16\
o\xda\x84pB2\x1f\x81Fa\x8c\x9c\x08\x04Z{\xcf\xa72\xbcv\xfa\xc5\x08 \x80r\x80\
@@ -207,78 +207,78 @@ def GetMondrianImage():
#----------------------------------------------------------------------
file_broken = PyEmbeddedImage(
- "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAAK/INwWK6QAADU9J"
- "REFUeJzNWn1QE2cefja7yRI+lAKiAgKCVIqegUYMFMsM4kfvzk7nmFrnvHGcOT3bq3P/OJ1p"
- "b+zYf+r0HGxt6VVFqpYqWq9TW23RVnp6R7FXiq0UPAGhyFeQSCQJISHZ7Mf9gZuGkE02IeA9"
- "M5k3u/vuu+/z/H7v7/297y4BPzh//vxfSJIsIgjC5a/eTIPn+UnHgiDIqisIAsUwTNfmzZtf"
- "A8D7qk/5e3B0dPS6wsLCp/09MFTIbdO7ntR9vs5HRESgvr6+E0AlAD2AKZX8CsDzvEKtVsvq"
- "aKjw7LggCO7jcJQqlQoMw6gBpAIYRAgCECGxCgDPTsohEopI4n+e5xXww1MRHkry4d1Zf9fk"
- "uv90MOsCeMKfGN51pO6ZrmizKsBsWt976EjhoQ+BYMQItpSDWRNAjptPZ4xLCfl/PQTCaX2p"
- "+wNhVgSYbet7tumdRXpj1ofAbFhfqn1fmHEBHpb1AYAgAudxMy4AQRB+LReuSB/MGsETMyqA"
- "2WyG1WqVZQl/CDUZeuge0NvbKwwODk7bC7zryYFI/qF6QGNj42BnZ6dZ6rocQtNNhQNhxgQw"
- "Go24fPnyDy0tLTcFQfDpBZ7/w2198RcIMyZAW1vb+KVLlxoGBwfr7927B4Vi8qO8CfnqbCjW"
- "D4Y8MEMCCIKA77777me73d7a1tb25dDQkNXzmud/giDgdDrBsqzkuA1l7CuVSgCA0+n0y3FG"
- "BBgYGMCVK1eub926dRFN04aBgYH/el73JKRUKjE4OIi+vj5QFDWtaVG0fGRkJHiex7lz5xyn"
- "T59uBMBI9TWsAoidaW1tNTc1Nd1cv379zuzs7F91dHT8x+l0TooDnuju7h779ttvjdOdLlUq"
- "FaKjo9HV1YX9+/d379q16+QXX3xxFsAAMHU7DAgggNw1tQiCIOByuXDt2rWbK1asUOfk5KxM"
- "SUlZW19f39LX18eTJDmpbbG8cePGndra2mtDQ0NQKpUhJUPR0dHgeR6ffvqpbdeuXV+9/vrr"
- "R4eGhs4A+ArA3ZAECAXd3d24dOnSD2VlZavy8vKQmppaUFdXN2gwGO561yVJEmazGR0dHV3n"
- "z5//+NatW0MU5XebcgooikJMTAy6urqwb9++zp07d1ZfvXq1GsAn8+bNa6qsrEyGxJY4EGBT"
- "lCAIhVR0ZhgGTqcTTqcTDocDDocDgiDgm2++0Y+MjNxbuXLl7wmCQFpaWtbcuXMje3p6fly9"
- "enWyeL8gCCBJEj09PUJLS0s7z/PXWlpavigoKNhBURRYlnU/S6qMjIwEwzD47LPPbIcOHWq4"
- "cuXKPwF8D+DHF154QV1cXFxpsVjiAGwGYIUPL/ArgNFoNNbV1dmtVqvdarW6LBaLY2xszOFw"
- "OBiLxWKz2WxOs9lsHx0ddZhMJpvZbB7v7u7+effu3elZWVmJAJCUlBS1bt26nNbW1kaj0fj0"
- "I4884iYHAHfu3Lnf2dnZDWC4oaHhH08++eRWrVZLe9bxJk9RFNRqNTo6OvDhhx92Hj16tG5k"
- "ZKQBwHUAneXl5cVarfaQVqtddurUqesAUgC0BysAsWfPngOjo6ONY2NjUQzDOACMA7ADcGAi"
- "sjoBuB6U4jFTWlp6Kj4+HjzPIzExEbm5uSuPHz9+csuWLfaEhIRIl8sFgiDA8zxu3rz585Yt"
- "W3SpqanX9u7d+93GjRuv5eXlrRGvT+oQQUCtVsPhcODcuXO2w4cPi1ZvAnADgP3EiRN7NBrN"
- "ntzcXDXHcXA6nREAJF9u+BNA6OnpuQ1gGAD5gCjrUXIPFOUflAIA7siRI8Xp6ekaYOI1lVKp"
- "RGZmpqatre2QXq/v1mg0y4EJKxoMBrS1tQ2UlJQ8abPZjAD23Lhx46Pi4uI1aWlp7mEl1qdp"
- "Grdu3UJNTU1nVVVV3cjIyDUAPwJof+WVVzJ0Ol1NQUHBbxMTEyHOOoEQKOKMP/jJxoIFC/6Q"
- "mZlJidYTBAHp6emp2dnZCV1dXY0MwywnCAIkSUKv1zu7u7uNu3fvTh8aGtoE4Pj7779/ec2a"
- "NZ0ZGRlZwC9Wt9vt+Pzzz22VlZUNV69eFa3+EwDTkSNHynJyct5ZtWpVikKhgMPhgEKhkJx2"
- "gxFgSv1t27ZRUVFRFMuyZGZmZmJcXNwcpVIZT9N0tMvlWpiSklKmVConBbGkpCRq3bp1Kxsb"
- "G69v3Lhxe3p6OgRBQHt7u2Hx4sVRycnJ9Ny5czO3bdv2VHV19XvNzc2frF69+pXY2FgoFAop"
- "q3ds2rQp6plnnnkzLy9v99KlS8EwDDiOC2r5LSnAiRMnIubNm/dHkiSzaZqOIUkygabpGIqi"
- "4iiKmkuSZDRJkiqVSkWRJKmkaZqMiIhAZGQkOI5zk+c4DnFxccjOztZWVVV9+eKLLw5nZGTM"
- "YxgGzc3Ndx577LGF8fHxiI2NhU6n+111dfWZixcvnispKfmzTqebe+HCBW+rtwK4/8Ybb+Rp"
- "NJojBQUFq2JiYuB0OgH8kgqLpdiXoAVobW2NfvbZZ/cWFhbOly3ngwf6yvczMzNzWJZV9Pb2"
- "/lRUVLR2cHAQt2/fvrt9+3YtSZJQKBRYtmxZYXFx8ar6+vqrTU1NF7/++mtdZWXll0ajsQET"
- "Qa4TE3HmBY1Gsz8/P3+Oy+Vyj3dP8nK9QFKA/v5+Cn7GfzBZmiAISE5OTiwqKsq4fft2k91u"
- "X9vf3283GAyWtLS0ZNFTsrOzI0pKSsrq6+v//c477/xNr9evwMRr7ZsAhl966aUFOp3uzfz8"
- "/C2LFi3C+Pj4JMLeAsjJYiUFYFk2oIRyReA4DikpKSgqKlpZW1t7saysjOvo6NAvXbo0NjEx"
- "MZLneXAchzlz5kCj0TwVGxu7RK/Xt2Mihx8DwBw4cGBDbm5uRWFh4aNKpRJ2u30S8VCsD8hY"
- "CwRzXqouz/OIiopCVlaWtrm5+X57e/tAS0uLPicnJzEhIcE9TnmeR05OTvJzzz33a0xMtyNa"
- "rVY4fvz4a6WlpRdKSkoeFZfPYpSXIi93SyzYWWASMTmlZ/2MjIys+Pj4mI6Ojoa+vj5h/fr1"
- "xaKrikIlJyfj8ccfLwNw7NVXX43TarV/LyoqWhsXF4fx8XF3TPFF2Pv/tPIAu93ul7g/+BJD"
- "EAQsXLgwqrS0NLexsfE8RVHLFi1atNn7PpVKhdzc3OUvv/zyvg0bNvwmPz8/WeyPt8sHEkLO"
- "anZaQyCYDUmO47BgwQIsX758VW1t7bc6nU5ISkpSeuYLHMeBYRhkZWWpd+zY8afCwsJklmXB"
- "MMwUlw9EXjwOhIDL4dHRUQwMDMBms4Hn+YCuJSUKz/NQqVRYsmTJcgDzlixZsnzOnDlu1xfj"
- "AMdxoGkaqampsNvtEATBvZ8olzxBEO57whIDxsbGMD4+DrVajaioKERGRoKiKMmdXn9IT09P"
- "Li4ufiIxMVEHACzLThGW47gp54IhHwz8CiCSEt3P4XDA6XTCYrGApmnQNA2VSuUWwzvyescA"
- "l8uF+fPnK59//vm/zp8/f6FoebF98VlSBOWS99WXkATwfrhnw+JmiEKhgEKhAEmSEDM6KTEI"
- "gkBcXBwRExOTkpCQAJfLNSPkg4EsD/Algncs4Hl+ktv6+onjOS0tDTRNT1q4hJN8MCKE5AFS"
- "nQx0DQAYhkFqaqpbrJkmH5YPJMJFXqFQTBmTM0E+LB5gt9slXTpU8t4E5JKXSnsDkfV+HReU"
- "AJ6YLnlf1pNLXhAEmM1msCw7KSZ598/7PEEQ4DgOLMv6VSHQt8JhIS/HG/y5vV6vh9FohFqt"
- "ducN3r8pxCgKJpMJvb29o/hlzzI4AUSEk7yUtfyJwTAMMjMzsXjxYr/zuuf7wbt376K8vLz/"
- "7NmzlzCxpA5NgHCTl1vHFzkAPjNE774aDAaUl5f3V1RU1HAc9y9MbKr4RMA8QIr4TJP3LEU3"
- "5zjOnTtItWUwGLB//36R/CVMbKXZQhbAV2dnk7zYD3G1KI537/oURbndvqKi4hTHcV9iYvd4"
- "zB/HkFPh6ZL3JurvHIBJXuB9XfzG4MCBA/3vvvtujVzysgTwR2I65KVmAl/3iUtmlmUnDQGR"
- "/P3793H48GH9A/Ki2wckH1AAzxjgS4yZJO/dD899A7EORVEYGRlBVVWV8b333vs4GMvLEsAT"
- "oQ4Ff+Q92/YniGcMEAUQ5/ljx44Nv/XWWx9ZrdaLAJqDIR9QAO/9gHCTlxsERRFEAZRKJUwm"
- "E6qrq4cPHjx4xmq11mLi1bglGPIBBfBF8mGQFyHmACaTCSdPnhx+++23z4yOjtZi4pWZKVjy"
- "sgTwFiIU8v7GuVzyIsxmM06fPj188ODBjx5Y/nsAkl+jBoLsPECEryDl7ziQMHLJkyQJi8WC"
- "mpqa4YqKCtHtmzAN8oCM9wJKpRIRERGyyAQi6CvwyeokRcFsNqOurm64oqLijMVimZbbT2pb"
- "6gJN04TNZlNZLBYwDOOeEgNtMsqpF+y1sbEx1NbWDn/wwQdhJQ8AkmZYsWJFVEZGxtZ79+49"
- "wbIsDa/VlBQJqS0of6QD3UMQBHp7e++YTKYrCIPbe8KfHyoALACwGIAqXA8MEQImPnO7A2Ak"
- "nA3/D+/OyD/Ur3BPAAAAAElFTkSuQmCC")
+ b"iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAAK/INwWK6QAADU9J"
+ b"REFUeJzNWn1QE2cefja7yRI+lAKiAgKCVIqegUYMFMsM4kfvzk7nmFrnvHGcOT3bq3P/OJ1p"
+ b"b+zYf+r0HGxt6VVFqpYqWq9TW23RVnp6R7FXiq0UPAGhyFeQSCQJISHZ7Mf9gZuGkE02IeA9"
+ b"M5k3u/vuu+/z/H7v7/297y4BPzh//vxfSJIsIgjC5a/eTIPn+UnHgiDIqisIAsUwTNfmzZtf"
+ b"A8D7qk/5e3B0dPS6wsLCp/09MFTIbdO7ntR9vs5HRESgvr6+E0AlAD2AKZX8CsDzvEKtVsvq"
+ b"aKjw7LggCO7jcJQqlQoMw6gBpAIYRAgCECGxCgDPTsohEopI4n+e5xXww1MRHkry4d1Zf9fk"
+ b"uv90MOsCeMKfGN51pO6ZrmizKsBsWt976EjhoQ+BYMQItpSDWRNAjptPZ4xLCfl/PQTCaX2p"
+ b"+wNhVgSYbet7tumdRXpj1ofAbFhfqn1fmHEBHpb1AYAgAudxMy4AQRB+LReuSB/MGsETMyqA"
+ b"2WyG1WqVZQl/CDUZeuge0NvbKwwODk7bC7zryYFI/qF6QGNj42BnZ6dZ6rocQtNNhQNhxgQw"
+ b"Go24fPnyDy0tLTcFQfDpBZ7/w2198RcIMyZAW1vb+KVLlxoGBwfr7927B4Vi8qO8CfnqbCjW"
+ b"D4Y8MEMCCIKA77777me73d7a1tb25dDQkNXzmud/giDgdDrBsqzkuA1l7CuVSgCA0+n0y3FG"
+ b"BBgYGMCVK1eub926dRFN04aBgYH/el73JKRUKjE4OIi+vj5QFDWtaVG0fGRkJHiex7lz5xyn"
+ b"T59uBMBI9TWsAoidaW1tNTc1Nd1cv379zuzs7F91dHT8x+l0TooDnuju7h779ttvjdOdLlUq"
+ b"FaKjo9HV1YX9+/d379q16+QXX3xxFsAAMHU7DAgggNw1tQiCIOByuXDt2rWbK1asUOfk5KxM"
+ b"SUlZW19f39LX18eTJDmpbbG8cePGndra2mtDQ0NQKpUhJUPR0dHgeR6ffvqpbdeuXV+9/vrr"
+ b"R4eGhs4A+ArA3ZAECAXd3d24dOnSD2VlZavy8vKQmppaUFdXN2gwGO561yVJEmazGR0dHV3n"
+ b"z5//+NatW0MU5XebcgooikJMTAy6urqwb9++zp07d1ZfvXq1GsAn8+bNa6qsrEyGxJY4EGBT"
+ b"lCAIhVR0ZhgGTqcTTqcTDocDDocDgiDgm2++0Y+MjNxbuXLl7wmCQFpaWtbcuXMje3p6fly9"
+ b"enWyeL8gCCBJEj09PUJLS0s7z/PXWlpavigoKNhBURRYlnU/S6qMjIwEwzD47LPPbIcOHWq4"
+ b"cuXKPwF8D+DHF154QV1cXFxpsVjiAGwGYIUPL/ArgNFoNNbV1dmtVqvdarW6LBaLY2xszOFw"
+ b"OBiLxWKz2WxOs9lsHx0ddZhMJpvZbB7v7u7+effu3elZWVmJAJCUlBS1bt26nNbW1kaj0fj0"
+ b"I4884iYHAHfu3Lnf2dnZDWC4oaHhH08++eRWrVZLe9bxJk9RFNRqNTo6OvDhhx92Hj16tG5k"
+ b"ZKQBwHUAneXl5cVarfaQVqtddurUqesAUgC0BysAsWfPngOjo6ONY2NjUQzDOACMA7ADcGAi"
+ b"sjoBuB6U4jFTWlp6Kj4+HjzPIzExEbm5uSuPHz9+csuWLfaEhIRIl8sFgiDA8zxu3rz585Yt"
+ b"W3SpqanX9u7d+93GjRuv5eXlrRGvT+oQQUCtVsPhcODcuXO2w4cPi1ZvAnADgP3EiRN7NBrN"
+ b"ntzcXDXHcXA6nREAJF9u+BNA6OnpuQ1gGAD5gCjrUXIPFOUflAIA7siRI8Xp6ekaYOI1lVKp"
+ b"RGZmpqatre2QXq/v1mg0y4EJKxoMBrS1tQ2UlJQ8abPZjAD23Lhx46Pi4uI1aWlp7mEl1qdp"
+ b"Grdu3UJNTU1nVVVV3cjIyDUAPwJof+WVVzJ0Ol1NQUHBbxMTEyHOOoEQKOKMP/jJxoIFC/6Q"
+ b"mZlJidYTBAHp6emp2dnZCV1dXY0MwywnCAIkSUKv1zu7u7uNu3fvTh8aGtoE4Pj7779/ec2a"
+ b"NZ0ZGRlZwC9Wt9vt+Pzzz22VlZUNV69eFa3+EwDTkSNHynJyct5ZtWpVikKhgMPhgEKhkJx2"
+ b"gxFgSv1t27ZRUVFRFMuyZGZmZmJcXNwcpVIZT9N0tMvlWpiSklKmVConBbGkpCRq3bp1Kxsb"
+ b"G69v3Lhxe3p6OgRBQHt7u2Hx4sVRycnJ9Ny5czO3bdv2VHV19XvNzc2frF69+pXY2FgoFAop"
+ b"q3ds2rQp6plnnnkzLy9v99KlS8EwDDiOC2r5LSnAiRMnIubNm/dHkiSzaZqOIUkygabpGIqi"
+ b"4iiKmkuSZDRJkiqVSkWRJKmkaZqMiIhAZGQkOI5zk+c4DnFxccjOztZWVVV9+eKLLw5nZGTM"
+ b"YxgGzc3Ndx577LGF8fHxiI2NhU6n+111dfWZixcvnispKfmzTqebe+HCBW+rtwK4/8Ybb+Rp"
+ b"NJojBQUFq2JiYuB0OgH8kgqLpdiXoAVobW2NfvbZZ/cWFhbOly3ngwf6yvczMzNzWJZV9Pb2"
+ b"/lRUVLR2cHAQt2/fvrt9+3YtSZJQKBRYtmxZYXFx8ar6+vqrTU1NF7/++mtdZWXll0ajsQET"
+ b"Qa4TE3HmBY1Gsz8/P3+Oy+Vyj3dP8nK9QFKA/v5+Cn7GfzBZmiAISE5OTiwqKsq4fft2k91u"
+ b"X9vf3283GAyWtLS0ZNFTsrOzI0pKSsrq6+v//c477/xNr9evwMRr7ZsAhl966aUFOp3uzfz8"
+ b"/C2LFi3C+Pj4JMLeAsjJYiUFYFk2oIRyReA4DikpKSgqKlpZW1t7saysjOvo6NAvXbo0NjEx"
+ b"MZLneXAchzlz5kCj0TwVGxu7RK/Xt2Mihx8DwBw4cGBDbm5uRWFh4aNKpRJ2u30S8VCsD8hY"
+ b"CwRzXqouz/OIiopCVlaWtrm5+X57e/tAS0uLPicnJzEhIcE9TnmeR05OTvJzzz33a0xMtyNa"
+ b"rVY4fvz4a6WlpRdKSkoeFZfPYpSXIi93SyzYWWASMTmlZ/2MjIys+Pj4mI6Ojoa+vj5h/fr1"
+ b"xaKrikIlJyfj8ccfLwNw7NVXX43TarV/LyoqWhsXF4fx8XF3TPFF2Pv/tPIAu93ul7g/+BJD"
+ b"EAQsXLgwqrS0NLexsfE8RVHLFi1atNn7PpVKhdzc3OUvv/zyvg0bNvwmPz8/WeyPt8sHEkLO"
+ b"anZaQyCYDUmO47BgwQIsX758VW1t7bc6nU5ISkpSeuYLHMeBYRhkZWWpd+zY8afCwsJklmXB"
+ b"MMwUlw9EXjwOhIDL4dHRUQwMDMBms4Hn+YCuJSUKz/NQqVRYsmTJcgDzlixZsnzOnDlu1xfj"
+ b"AMdxoGkaqampsNvtEATBvZ8olzxBEO57whIDxsbGMD4+DrVajaioKERGRoKiKMmdXn9IT09P"
+ b"Li4ufiIxMVEHACzLThGW47gp54IhHwz8CiCSEt3P4XDA6XTCYrGApmnQNA2VSuUWwzvyescA"
+ b"l8uF+fPnK59//vm/zp8/f6FoebF98VlSBOWS99WXkATwfrhnw+JmiEKhgEKhAEmSEDM6KTEI"
+ b"gkBcXBwRExOTkpCQAJfLNSPkg4EsD/Algncs4Hl+ktv6+onjOS0tDTRNT1q4hJN8MCKE5AFS"
+ b"nQx0DQAYhkFqaqpbrJkmH5YPJMJFXqFQTBmTM0E+LB5gt9slXTpU8t4E5JKXSnsDkfV+HReU"
+ b"AJ6YLnlf1pNLXhAEmM1msCw7KSZ598/7PEEQ4DgOLMv6VSHQt8JhIS/HG/y5vV6vh9FohFqt"
+ b"ducN3r8pxCgKJpMJvb29o/hlzzI4AUSEk7yUtfyJwTAMMjMzsXjxYr/zuuf7wbt376K8vLz/"
+ b"7NmzlzCxpA5NgHCTl1vHFzkAPjNE774aDAaUl5f3V1RU1HAc9y9MbKr4RMA8QIr4TJP3LEU3"
+ b"5zjOnTtItWUwGLB//36R/CVMbKXZQhbAV2dnk7zYD3G1KI537/oURbndvqKi4hTHcV9iYvd4"
+ b"zB/HkFPh6ZL3JurvHIBJXuB9XfzG4MCBA/3vvvtujVzysgTwR2I65KVmAl/3iUtmlmUnDQGR"
+ b"/P3793H48GH9A/Ki2wckH1AAzxjgS4yZJO/dD899A7EORVEYGRlBVVWV8b333vs4GMvLEsAT"
+ b"oQ4Ff+Q92/YniGcMEAUQ5/ljx44Nv/XWWx9ZrdaLAJqDIR9QAO/9gHCTlxsERRFEAZRKJUwm"
+ b"E6qrq4cPHjx4xmq11mLi1bglGPIBBfBF8mGQFyHmACaTCSdPnhx+++23z4yOjtZi4pWZKVjy"
+ b"sgTwFiIU8v7GuVzyIsxmM06fPj188ODBjx5Y/nsAkl+jBoLsPECEryDl7ziQMHLJkyQJi8WC"
+ b"mpqa4YqKCtHtmzAN8oCM9wJKpRIRERGyyAQi6CvwyeokRcFsNqOurm64oqLijMVimZbbT2pb"
+ b"6gJN04TNZlNZLBYwDOOeEgNtMsqpF+y1sbEx1NbWDn/wwQdhJQ8AkmZYsWJFVEZGxtZ79+49"
+ b"wbIsDa/VlBQJqS0of6QD3UMQBHp7e++YTKYrCIPbe8KfHyoALACwGIAqXA8MEQImPnO7A2Ak"
+ b"nA3/D+/OyD/Ur3BPAAAAAElFTkSuQmCC")
def getDataSH():
""" Return the first part of the shadow dropped behind thumbnails. """
return zlib.decompress(
-'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2_A\x98\x83\rHvl\
+b'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2_A\x98\x83\rHvl\
\xdc\x9c\n\xa4X\x8a\x9d\x00)\xce\x02\x8f\xc8b\x06\x06na\x10fd\x985G\x02(\xd8W\xe2\x1aQ\
\xe2\x9c\x9f\x9b\x9b\x9aW\xc2\x90\xec\x11\xe4\xab\x90\x9cQ\x9a\x97\x9d\x93\
\x9a\xa7`l\xa4\x90\x99\x9e\x97_\x94\x9a\xc2\xeb\x18\xec\xec\xe9i\xa5\xa0\xa7\
@@ -654,7 +655,7 @@ def GetdragcursorBitmap():
def GetdragcursorImage():
""" Returns the drag and drop cursor image as a :class:`Image`. """
- stream = six.StringIO(GetdragcursorData())
+ stream = six.BytesIO(GetdragcursorData())
return wx.Image(stream)
@@ -7493,7 +7494,7 @@ class UltimateListMainWindow(wx.ScrolledWindow):
if self.InReportView():
if not self.HasAGWFlag(ULC_HAS_VARIABLE_ROW_HEIGHT):
- current = y/self.GetLineHeight()
+ current = y // self.GetLineHeight()
if current < count:
newItem, hitResult = self.HitTestLine(current, x, y)
else:
@@ -9662,7 +9663,7 @@ class UltimateListMainWindow(wx.ScrolledWindow):
if entireHeight > self.GetClientSize()[1]:
decrement = SCROLL_UNIT_X
- self._linesPerPage = clientHeight/lineHeight
+ self._linesPerPage = clientHeight//lineHeight
self.SetScrollbars(SCROLL_UNIT_X, lineHeight,
(self.GetHeaderWidth()-decrement)/SCROLL_UNIT_X,
diff --git a/wx/lib/agw/xlsgrid.py b/wx/lib/agw/xlsgrid.py
index 6077c33f..89c600e6 100644
--- a/wx/lib/agw/xlsgrid.py
+++ b/wx/lib/agw/xlsgrid.py
@@ -30,6 +30,7 @@
#
# Or, obviously, to the wxPython mailing list!!!
#
+# Tags: phoenix-port, documented, unittest, py3-port
#
# End of comments
# --------------------------------------------------------------------------------- #
@@ -670,7 +671,7 @@ class XLSText(object):
name = font.name
size = int(font.height/20.0)
- if font.escapement_type > 0:
+ if font.escapement > 0:
# subscript/superscript
size = int(size*0.7)
@@ -1049,7 +1050,7 @@ class XLSRichText(XLSText):
text_colour = book.colour_map[font.colour_index]
colour = self.CreateTextColour(text_colour)
- ffont.escapement = font.escapement_type
+ ffont.escapement = font.escapement
attributes.append([chunk, ffont, colour])
self.attributes = attributes
@@ -1183,7 +1184,7 @@ class XLSBackground(object):
if fill_pattern <= 0:
return
- r, g, b = pattern_colour
+ r, g, b, a = pattern_colour
fill_image = eval("_xls_background_%02d.GetImage()"%fill_pattern)
fill_image.Replace(0, 0, 0, r, g, b)
@@ -1662,7 +1663,7 @@ class XLSCell(object):
return self.comment
-class XLSRenderer(gridlib.PyGridCellRenderer):
+class XLSRenderer(gridlib.GridCellRenderer):
"""
This class is responsible for actually drawing the cell in the grid.
@@ -1675,7 +1676,7 @@ class XLSRenderer(gridlib.PyGridCellRenderer):
:param `cell`: an instance of :class:`XLSCell`.
"""
- gridlib.PyGridCellRenderer.__init__(self)
+ gridlib.GridCellRenderer.__init__(self)
self.cell = cell
@@ -1721,7 +1722,7 @@ class XLSRenderer(gridlib.PyGridCellRenderer):
gdc.DrawRectangle(rect)
-class XLSTable(gridlib.PyGridTableBase):
+class XLSTable(gridlib.GridTableBase):
"""
The almost abstract base class for grid tables.
@@ -1742,7 +1743,7 @@ class XLSTable(gridlib.PyGridTableBase):
"""
# The base class must be initialized *first*
- gridlib.PyGridTableBase.__init__(self)
+ gridlib.GridTableBase.__init__(self)
self.cells = cells
self.dimens = (rows, cols)
diff --git a/wx/lib/agw/zoombar.py b/wx/lib/agw/zoombar.py
index ed3a01f0..8a68b1a9 100644
--- a/wx/lib/agw/zoombar.py
+++ b/wx/lib/agw/zoombar.py
@@ -1,3 +1,22 @@
+# --------------------------------------------------------------------------------- #
+# ZoomBar wxPython IMPLEMENTATION
+#
+# Andrea Gavana @ 19 Dec 2012, 21.00 GMT
+#
+#
+# For all kind of problems, requests of enhancements and bug reports, please write
+# to me at:
+#
+# andrea.gavana@gmail.com
+# andrea.gavana@maerskoil.com
+#
+# Or, obviously, to the wxPython mailing list!!!
+#
+# Tags: phoenix-port, documented, unittest, py3-port
+#
+# End of comments
+# --------------------------------------------------------------------------------- #
+
"""
:class:`ZoomBar` is a class that *appoximatively* mimics the behaviour of the Mac Dock,
inside a :class:`Panel`.
diff --git a/wx/lib/fancytext.py b/wx/lib/fancytext.py
index 339ea604..46a6e279 100644
--- a/wx/lib/fancytext.py
+++ b/wx/lib/fancytext.py
@@ -8,7 +8,7 @@
# Version:
# Date:
# Licence:
-# Tags: phoenix-port
+# Tags: phoenix-port, py3-port
#----------------------------------------------------------------------------
# 12/02/2003 - Jeff Grimmett (grimmtooth@softhome.net)
#
@@ -58,6 +58,8 @@ import math
import sys
import wx
+import wx.lib.six as six
+
import xml.parsers.expat
__all__ = "GetExtent", "GetFullExtent", "RenderToBitmap", "RenderToDC", "StaticFancyText"
@@ -336,7 +338,8 @@ def RenderToRenderer(str, renderer, enclose=True):
if enclose:
str = '%s' % str
p = xml.parsers.expat.ParserCreate()
- p.returns_unicode = 0
+ if six.PY2:
+ p.returns_unicode = 0
p.StartElementHandler = renderer.startElement
p.EndElementHandler = renderer.endElement
p.CharacterDataHandler = renderer.characterData
@@ -379,7 +382,7 @@ def RenderToBitmap(str, background=None, enclose=1):
RenderToRenderer(str, renderer, enclose)
dc.SelectObject(wx.NullBitmap)
if background is None:
- img = wx.ImageFromBitmap(bmp)
+ img = bmp.ConvertToImage()
bg = dc.GetBackground().GetColour()
img.SetMaskColour(bg.Red(), bg.Green(), bg.Blue())
bmp = img.ConvertToBitmap()
diff --git a/wx/lib/masked/maskededit.py b/wx/lib/masked/maskededit.py
index ad5d0b91..ebd554ee 100644
--- a/wx/lib/masked/maskededit.py
+++ b/wx/lib/masked/maskededit.py
@@ -50,6 +50,8 @@
# o wxIpAddrCtrl -> IpAddrCtrl
# o wxTimeCtrl -> TimeCtrl
#
+# Tags: phoenix-port, unittest, documented, py3-port
+#
__doc__ = r"""\
contains MaskedEditMixin class that drives all the other masked controls.
@@ -3066,9 +3068,15 @@ class MaskedEditMixin:
excludes = six.text_type()
if not isinstance(field._excludeChars, six.text_type):
- excludes += field._excludeChars.decode(self._defaultEncoding)
+ if six.PY3:
+ excludes += field._excludeChars
+ else:
+ excludes += field._excludeChars.decode(self._defaultEncoding)
if not isinstance(self._ctrl_constraints, six.text_type):
- excludes += self._ctrl_constraints._excludeChars.decode(self._defaultEncoding)
+ if six.PY3:
+ excludes += field._excludeChars
+ else:
+ excludes += self._ctrl_constraints._excludeChars.decode(self._defaultEncoding)
else:
excludes += self._ctrl_constraints._excludeChars