diff --git a/0001-Check-HSV-values-in-image-test.patch b/0001-Check-HSV-values-in-image-test.patch new file mode 100644 index 0000000..b16aa7d --- /dev/null +++ b/0001-Check-HSV-values-in-image-test.patch @@ -0,0 +1,26 @@ +From 12cb5458cf5c26080158ecbee010ae9073a907e7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20Br=C3=BCns?= +Date: Sun, 4 Oct 2020 21:19:36 +0200 +Subject: [PATCH] Check HSV values in image test + +--- + unittests/test_image.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/unittests/test_image.py b/unittests/test_image.py +index 767b36a7..a1dc0d7d 100644 +--- a/unittests/test_image.py ++++ b/unittests/test_image.py +@@ -234,6 +234,9 @@ class image_Tests(wtc.WidgetTestCase): + rgb = wx.Image.RGBValue(1,2,3) + hsv = wx.Image.RGBtoHSV(rgb) + rgb = wx.Image.HSVtoRGB(hsv) ++ self.assertAlmostEqual(hsv.value * 255.0, 3.0) ++ self.assertAlmostEqual(hsv.saturation* 255.0, 170.0) ++ self.assertAlmostEqual(hsv.hue * 360.0, 210.0) + self.assertEqual(rgb.red, 1) + self.assertEqual(rgb.green, 2) + self.assertEqual(rgb.blue, 3) +-- +2.28.0 + diff --git a/0001-Fix-overflow-check-for-wxUIntPtr-type.patch b/0001-Fix-overflow-check-for-wxUIntPtr-type.patch new file mode 100644 index 0000000..677d367 --- /dev/null +++ b/0001-Fix-overflow-check-for-wxUIntPtr-type.patch @@ -0,0 +1,31 @@ +From c72d78fb983bf2efe4041f5d3c86670b92e98565 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20Br=C3=BCns?= +Date: Sun, 4 Oct 2020 23:02:19 +0200 +Subject: [PATCH] Fix overflow check for wxUIntPtr type + +long is 32bit on 32-bit archs and on Win64 (see +https://en.cppreference.com/w/cpp/language/types ). As SIP uses +PyLong_AsLongLong internally and uses an extra bounds check only if +explicitly enabled("sip.enableoverflowchecking(True)"), the overflow +only triggers when it also overflows `long long`, i.e. when +_LONG_MAX == _LLONG_MAX. +--- + unittests/test_listctrl.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/unittests/test_listctrl.py b/unittests/test_listctrl.py +index c8c2d39a..0b2e3706 100644 +--- a/unittests/test_listctrl.py ++++ b/unittests/test_listctrl.py +@@ -185,7 +185,7 @@ class listctrl_Tests(wtc.WidgetTestCase): + def test_listctrlItemData02(self): + lc = self._makeListCtrl() + with self.assertRaises(OverflowError): +- lc.SetItemData(0, wx._core._LONG_MAX + 100) ++ lc.SetItemData(0, wx._core._LLONG_MAX + 100) + + + def test_listctrlDeleteAllColumns(self): +-- +2.28.0 + diff --git a/0001-Only-import-attrdict-where-needed.patch b/0001-Only-import-attrdict-where-needed.patch new file mode 100644 index 0000000..65fa551 --- /dev/null +++ b/0001-Only-import-attrdict-where-needed.patch @@ -0,0 +1,36 @@ +From 60a1917825044fc3a43dc39ef8de2b944150dc8a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20Br=C3=BCns?= +Date: Sat, 25 Jun 2022 18:50:45 +0200 +Subject: [PATCH 1/4] Only import attrdict where needed + +Its only used for MSVC builds, but an unnecessary external dependency +elsewhere. +--- + buildtools/config.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/buildtools/config.py b/buildtools/config.py +index 4482ba9d..493a63c5 100644 +--- a/buildtools/config.py ++++ b/buildtools/config.py +@@ -27,8 +27,6 @@ from distutils.dep_util import newer + + import distutils.sysconfig + +-from attrdict import AttrDict +- + runSilently = False + + #---------------------------------------------------------------------- +@@ -989,6 +987,8 @@ def getMSVCInfo(PYTHON, arch, set_env=False): + if MSVCinfo is not None: + return MSVCinfo + ++ from attrdict import AttrDict ++ + # Note that it starts with a monkey-patch in setuptools.msvc to + # workaround this issue: pypa/setuptools#1902 + cmd = \ +-- +2.36.1 + diff --git a/0003-Make-pip-usage-in-wxget-optional.patch b/0003-Make-pip-usage-in-wxget-optional.patch new file mode 100644 index 0000000..f88daa4 --- /dev/null +++ b/0003-Make-pip-usage-in-wxget-optional.patch @@ -0,0 +1,49 @@ +From 00ba66a86f65abb24402427d66bf50e8da477321 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20Br=C3=BCns?= +Date: Tue, 28 Jun 2022 18:16:34 +0200 +Subject: [PATCH 3/4] Make pip usage in wxget optional + +As the code states, using pip to download is abusing it, and as it is +just a fallback in case neither wget nor urllib works. +--- + wx/tools/wxget.py | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/wx/tools/wxget.py b/wx/tools/wxget.py +index c83ced7a..75eb0f47 100644 +--- a/wx/tools/wxget.py ++++ b/wx/tools/wxget.py +@@ -33,7 +33,6 @@ import os + import wx + import subprocess + import ssl +-import pip + + if sys.version_info >= (3,): + from urllib.error import (HTTPError, URLError) +@@ -44,6 +43,11 @@ else: + from urllib2 import (HTTPError, URLError) + import urlparse + ++try: ++ import pip ++except ImportError as e: ++ pip = None ++ + def get_docs_demo_url(demo=False): + """ Get the URL for the docs or demo.""" + if demo: +@@ -196,8 +200,8 @@ def download_file(url, dest=None, force=False, trusted=False): + success = download_wget(url, filename, trusted) # Try wget + if not success: + success = download_urllib(url, filename) # Try urllib +- if not success: +- success = download_pip(url, filename, force, trusted) # Try urllib ++ if not success and pip not None: ++ success = download_pip(url, filename, force, trusted) # Try pip + if not success: + split_url = url.split('/') + msg = '\n'.join([ +-- +2.36.1 + diff --git a/0004-Fix-time_t-ETG-typedef-extend-DateTime.FromTimeT-tes.patch b/0004-Fix-time_t-ETG-typedef-extend-DateTime.FromTimeT-tes.patch new file mode 100644 index 0000000..a7db15b --- /dev/null +++ b/0004-Fix-time_t-ETG-typedef-extend-DateTime.FromTimeT-tes.patch @@ -0,0 +1,55 @@ +From 70ecc1afcdd59bbd3b700d000e8f92740d218245 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Stefan=20Br=C3=BCns?= +Date: Tue, 28 Jun 2022 18:32:32 +0200 +Subject: [PATCH 4/4] Fix time_t ETG typedef, extend DateTime.FromTimeT tests + +Before c78823549bac ("Ensure time_t is treated as a 64-bit value by SIP") +the typedef used "long" instead of wxInt64, which caused issues on Win64, +as long is 32bit there (LLP64). On the other hand, wxInt64 is wrong on +32 bit Linux (e.g. armv7, i586), and thus the code crashes. + +As SIP_SSIZE_T is 64 bit for both LLP64 (Windows) and LP64 (Linux), but +32 bit on 32bit archs, it matches time_t better (though, according to the +C standard, it could even be a double). +--- + etg/defs.py | 2 +- + unittests/test_wxdatetime.py | 8 +++++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/etg/defs.py b/etg/defs.py +index 4445cf93..ceb9e2ef 100644 +--- a/etg/defs.py ++++ b/etg/defs.py +@@ -73,7 +73,7 @@ def run(): + td = module.find('wxUIntPtr') + module.insertItemAfter(td, etgtools.TypedefDef(type='wchar_t', name='wxUChar')) + module.insertItemAfter(td, etgtools.TypedefDef(type='wchar_t', name='wxChar')) +- module.insertItemAfter(td, etgtools.TypedefDef(type='wxInt64', name='time_t')) ++ module.insertItemAfter(td, etgtools.TypedefDef(type='long', name='time_t')) + module.insertItemAfter(td, etgtools.TypedefDef(type='long long', name='wxFileOffset')) + module.insertItemAfter(td, etgtools.TypedefDef(type='SIP_SSIZE_T', name='ssize_t')) + module.insertItemAfter(td, etgtools.TypedefDef(type='unsigned char', name='byte', pyInt=True)) +diff --git a/unittests/test_wxdatetime.py b/unittests/test_wxdatetime.py +index 62e7d141..2f620045 100644 +--- a/unittests/test_wxdatetime.py ++++ b/unittests/test_wxdatetime.py +@@ -25,9 +25,15 @@ class datetime_Tests(wtc.WidgetTestCase): + def test_datetime2(self): + d1 = wx.DateTime.FromHMS(8, 15, 45, 123) + d2 = wx.DateTime.FromJDN(12345.67) +- d3 = wx.DateTime.FromTimeT(int(time.time())) + d4 = wx.DateTime.FromDMY(1, wx.DateTime.Mar, 2012, 8, 15, 45, 123) + ++ def test_datetimeTimeT(self): ++ d1 = wx.DateTime.FromTimeT(0) ++ self.assertEqual(d1.year, 1970) ++ d2 = wx.DateTime.FromTimeT(1643756400) # 2022-02-02 ++ self.assertEqual(d2.year, 2022) ++ d3 = wx.DateTime.FromTimeT(int(time.time())) ++ + def test_datetime3(self): + d1 = wx.DateTime.Today() + d2 = wx.DateTime.Now() +-- +2.36.1 + diff --git a/2039-bunch-py310-fixes.patch b/2039-bunch-py310-fixes.patch deleted file mode 100644 index 230b635..0000000 --- a/2039-bunch-py310-fixes.patch +++ /dev/null @@ -1,2981 +0,0 @@ -From 173d0796810bb65de9bdfdc6941d24a04628f6c2 Mon Sep 17 00:00:00 2001 -From: Scott Talbert -Date: Wed, 1 Dec 2021 14:19:00 -0500 -Subject: [PATCH] Fix a bunch of Python 3.10 issues with pure-Python classes - and demos - -In Python 3.10, a change[1] was implemented where extension functions -that take integer arguments will no longer silently accept non-integer -arguments (e.g., floats) that can only be converted to integers with a -loss of precision. This PR fixes most of these issues in the pure-Python -classes and demos by explicitly converting the parameters to int before -passing them to wxWidgets. There is loss of precision, but this was -happening before (automatically) anyway as most wxWidgets DeviceContext -functions operate using integers. - -Additionally, the PR fixes a few sizing issues, mostly with SpinCtrls being -too small on GTK3. - -This is an example of the relevant exception: -Traceback (most recent call last): - File "/usr/lib64/python3.10/site-packages/wx/lib/agw/pygauge.py", line 355, in OnPaint - r.width = w -TypeError: 'float' object cannot be interpreted as an integer - -Fixes #2038. - -[1] https://bugs.python.org/issue37999 ---- - demo/GridLabelRenderer.py | 4 - - demo/Mask.py | 4 - - demo/Overlay.py | 1 - demo/PenAndBrushStyles.py | 2 - demo/PopupWindow.py | 2 - demo/PrintFramework.py | 2 - demo/PropertyGrid.py | 2 - demo/Sizers.py | 2 - demo/UIActionSimulator.py | 2 - demo/agw/AUI.py | 32 ++++----- - demo/agw/MacLargeDemo.py | 4 - - demo/agw/PeakMeter.py | 6 - - demo/agw/PersistentControls.py | 2 - demo/agw/RibbonBar.py | 2 - demo/agw/SpeedMeter.py | 2 - demo/agw/SuperToolTip.py | 3 - demo/agw/ThumbDemoConfig.py | 1 - demo/agw/UltimateReportDemo.py | 8 +- - demo/agw/Windows7Explorer_Contents.py | 16 ++-- - demo/agw/ZoomBar.py | 2 - wx/lib/agw/advancedsplash.py | 2 - wx/lib/agw/aui/auibook.py | 4 - - wx/lib/agw/balloontip.py | 4 - - wx/lib/agw/flatmenu.py | 62 +++++++++--------- - wx/lib/agw/flatnotebook.py | 10 +- - wx/lib/agw/floatspin.py | 2 - wx/lib/agw/gradientbutton.py | 8 +- - wx/lib/agw/hypertreelist.py | 2 - wx/lib/agw/knobctrl.py | 12 +-- - wx/lib/agw/labelbook.py | 32 ++++----- - wx/lib/agw/peakmeter.py | 2 - wx/lib/agw/pygauge.py | 4 - - wx/lib/agw/ribbon/art_aui.py | 22 +++--- - wx/lib/agw/ribbon/art_internal.py | 12 +-- - wx/lib/agw/ribbon/art_msw.py | 88 ++++++++++++------------- - wx/lib/agw/ribbon/bar.py | 4 - - wx/lib/agw/ribbon/buttonbar.py | 6 - - wx/lib/agw/ribbon/gallery.py | 8 +- - wx/lib/agw/ribbon/panel.py | 16 ++-- - wx/lib/agw/ribbon/toolbar.py | 2 - wx/lib/agw/scrolledthumbnail.py | 24 +++--- - wx/lib/agw/shapedbutton.py | 10 +- - wx/lib/agw/speedmeter.py | 70 +++++++++++--------- - wx/lib/agw/supertooltip.py | 20 ++--- - wx/lib/agw/toasterbox.py | 4 - - wx/lib/agw/ultimatelistctrl.py | 20 ++--- - wx/lib/agw/xlsgrid.py | 4 - - wx/lib/agw/zoombar.py | 10 +- - wx/lib/analogclock/analogclock.py | 2 - wx/lib/analogclock/helpers.py | 22 +++--- - wx/lib/analogclock/setup.py | 6 - - wx/lib/buttons.py | 10 +- - wx/lib/colourchooser/pycolourchooser.py | 4 - - wx/lib/colourchooser/pypalette.py | 2 - wx/lib/floatcanvas/FCObjects.py | 8 +- - wx/lib/gizmos/ledctrl.py | 8 +- - wx/lib/imagebrowser.py | 4 - - wx/lib/ogl/basic.py | 10 +- - wx/lib/ogl/bmpshape.py | 2 - wx/lib/ogl/composit.py | 4 - - wx/lib/ogl/divided.py | 2 - wx/lib/ogl/lines.py | 2 - wx/lib/ogl/oglmisc.py | 4 - - wx/lib/plot/examples/demo.py | 4 - - wx/lib/plot/plotcanvas.py | 110 ++++++++++++++++---------------- - wx/lib/plot/polyobjects.py | 22 +++--- - wx/lib/popupctl.py | 2 - wx/lib/scrolledpanel.py | 2 - wx/lib/throbber.py | 6 - - wx/lib/ticker.py | 4 - - 70 files changed, 408 insertions(+), 395 deletions(-) - ---- a/demo/GridLabelRenderer.py -+++ b/demo/GridLabelRenderer.py -@@ -46,8 +46,8 @@ class MyCornerLabelRenderer(glr.GridLabe - self._bmp = images.Smiles.GetBitmap() - - def Draw(self, grid, dc, rect, rc): -- x = rect.left + (rect.width - self._bmp.GetWidth()) / 2 -- y = rect.top + (rect.height - self._bmp.GetHeight()) / 2 -+ x = rect.left + (rect.width - self._bmp.GetWidth()) // 2 -+ y = rect.top + (rect.height - self._bmp.GetHeight()) // 2 - dc.DrawBitmap(self._bmp, x, y, True) - - ---- a/demo/Mask.py -+++ b/demo/Mask.py -@@ -90,9 +90,9 @@ class TestMaskWindow(wx.ScrolledWindow): - - for text, code in logicList: - x,y = 120+150*(i%4), 20+100*(i/4) -- dc.DrawText(text, x, y-20) -+ dc.DrawText(text, x, int(y-20)) - mdc.SelectObject(self.bmp_withcolourmask) -- dc.Blit(x,y, cx,cy, mdc, 0,0, code, True) -+ dc.Blit(x,int(y), cx,cy, mdc, 0,0, code, True) - i = i + 1 - - ---- a/demo/Overlay.py -+++ b/demo/Overlay.py -@@ -56,7 +56,6 @@ class TestPanel(wx.Panel): - self.penstylesCombo.SetToolTip('Pen Style') - - self.overlayPenWidth = wx.SpinCtrl(self, -1, value='', -- size=(75, -1), - style=wx.SP_ARROW_KEYS, - min=1, max=24, initial=1) - self.overlayPenWidth.SetToolTip('Pen Width') ---- a/demo/PenAndBrushStyles.py -+++ b/demo/PenAndBrushStyles.py -@@ -100,7 +100,7 @@ class PenPanel(BasePanel): - - dc.SetPen(pen) - y = labelHeight + (height - labelHeight)/2 -- dc.DrawLine(5, y, width-5, y) -+ dc.DrawLine(5, int(y), width-5, int(y)) - - - class BrushPanel(BasePanel): ---- a/demo/PopupWindow.py -+++ b/demo/PopupWindow.py -@@ -89,7 +89,7 @@ class TestTransientPopup(wx.PopupTransie - "(or its first child) loses focus in \n" - "any other way.") - btn = wx.Button(panel, -1, "Press Me") -- spin = wx.SpinCtrl(panel, -1, "Hello", size=(100,-1)) -+ spin = wx.SpinCtrl(panel, -1, "Hello") - btn.Bind(wx.EVT_BUTTON, self.OnButton) - - sizer = wx.BoxSizer(wx.VERTICAL) ---- a/demo/PrintFramework.py -+++ b/demo/PrintFramework.py -@@ -81,7 +81,7 @@ class MyPrintout(wx.Printout): - - #------------------------------------------- - self.canvas.DoDrawing(dc, True) -- dc.DrawText("Page: %d" % page, marginX/2, maxY-marginY) -+ dc.DrawText("Page: %d" % page, marginX//2, maxY-marginY) - - return True - ---- a/demo/PropertyGrid.py -+++ b/demo/PropertyGrid.py -@@ -150,7 +150,7 @@ class SizeProperty(wxpg.PGProperty): - """ Utility convert arbitrary value to a real wx.Size. - """ - import collections -- if isinstance(value, collections.Sequence) or hasattr(value, '__getitem__'): -+ if isinstance(value, collections.abc.Sequence) or hasattr(value, '__getitem__'): - value = wx.Size(*value) - return value - ---- a/demo/Sizers.py -+++ b/demo/Sizers.py -@@ -45,7 +45,7 @@ class SampleWindow(wx.Window): - dc = wx.PaintDC(self) - w,h = dc.GetTextExtent(self.text) - dc.Clear() -- dc.DrawText(self.text, (sz.width-w)/2, (sz.height-h)/2) -+ dc.DrawText(self.text, (sz.width-w)//2, (sz.height-h)//2) - - def OnSize(self, evt): - self.Refresh() ---- a/demo/UIActionSimulator.py -+++ b/demo/UIActionSimulator.py -@@ -88,7 +88,7 @@ class TestPanel(wx.Panel): - - def _setNextKeyEvent(self): - evtType, key, modifiers, milli = self._playbackEvents.pop(0) -- milli = max(milli/2, 1) # play back faster than it was recorded -+ milli = max(milli//2, 1) # play back faster than it was recorded - print(evtType, key, modifiers, milli) - wx.CallLater(milli, self._playbackKey, evtType, key, modifiers) - ---- a/demo/agw/AUI.py -+++ b/demo/agw/AUI.py -@@ -393,7 +393,7 @@ class SizeReportCtrl(wx.Control): - dc.SetPen(wx.LIGHT_GREY_PEN) - dc.DrawLine(0, 0, size.x, size.y) - dc.DrawLine(0, size.y, size.x, 0) -- dc.DrawText(s, (size.x-w)/2, (size.y-height*5)/2) -+ dc.DrawText(s, (size.x-w)//2, (size.y-height*5)//2) - - if self._mgr: - -@@ -401,19 +401,19 @@ class SizeReportCtrl(wx.Control): - - s = "Layer: %d"%pi.dock_layer - w, h = dc.GetTextExtent(s) -- dc.DrawText(s, (size.x-w)/2, ((size.y-(height*5))/2)+(height*1)) -+ dc.DrawText(s, (size.x-w)//2, ((size.y-(height*5))//2)+(height*1)) - - s = "Dock: %d Row: %d"%(pi.dock_direction, pi.dock_row) - w, h = dc.GetTextExtent(s) -- dc.DrawText(s, (size.x-w)/2, ((size.y-(height*5))/2)+(height*2)) -+ dc.DrawText(s, (size.x-w)//2, ((size.y-(height*5))//2)+(height*2)) - - s = "Position: %d"%pi.dock_pos - w, h = dc.GetTextExtent(s) -- dc.DrawText(s, (size.x-w)/2, ((size.y-(height*5))/2)+(height*3)) -+ dc.DrawText(s, (size.x-w)//2, ((size.y-(height*5))//2)+(height*3)) - - s = "Proportion: %d"%pi.dock_proportion - w, h = dc.GetTextExtent(s) -- dc.DrawText(s, (size.x-w)/2, ((size.y-(height*5))/2)+(height*4)) -+ dc.DrawText(s, (size.x-w)//2, ((size.y-(height*5))//2)+(height*4)) - - - def OnEraseBackground(self, event): -@@ -435,7 +435,7 @@ class SettingsPanel(wx.Panel): - - s1 = wx.BoxSizer(wx.HORIZONTAL) - self._border_size = wx.SpinCtrl(self, ID_PaneBorderSize, "%d"%frame.GetDockArt().GetMetric(aui.AUI_DOCKART_PANE_BORDER_SIZE), -- wx.DefaultPosition, wx.Size(50, 20), wx.SP_ARROW_KEYS, 0, 100, -+ wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS, 0, 100, - frame.GetDockArt().GetMetric(aui.AUI_DOCKART_PANE_BORDER_SIZE)) - s1.Add((1, 1), 1, wx.EXPAND) - s1.Add(wx.StaticText(self, -1, "Pane Border Size:")) -@@ -445,7 +445,7 @@ class SettingsPanel(wx.Panel): - - s2 = wx.BoxSizer(wx.HORIZONTAL) - self._sash_size = wx.SpinCtrl(self, ID_SashSize, "%d"%frame.GetDockArt().GetMetric(aui.AUI_DOCKART_SASH_SIZE), wx.DefaultPosition, -- wx.Size(50, 20), wx.SP_ARROW_KEYS, 0, 100, frame.GetDockArt().GetMetric(aui.AUI_DOCKART_SASH_SIZE)) -+ wx.DefaultSize, wx.SP_ARROW_KEYS, 0, 100, frame.GetDockArt().GetMetric(aui.AUI_DOCKART_SASH_SIZE)) - s2.Add((1, 1), 1, wx.EXPAND) - s2.Add(wx.StaticText(self, -1, "Sash Size:")) - s2.Add(self._sash_size) -@@ -454,7 +454,7 @@ class SettingsPanel(wx.Panel): - - s3 = wx.BoxSizer(wx.HORIZONTAL) - self._caption_size = wx.SpinCtrl(self, ID_CaptionSize, "%d"%frame.GetDockArt().GetMetric(aui.AUI_DOCKART_CAPTION_SIZE), -- wx.DefaultPosition, wx.Size(50, 20), wx.SP_ARROW_KEYS, 0, 100, frame.GetDockArt().GetMetric(aui.AUI_DOCKART_CAPTION_SIZE)) -+ wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS, 0, 100, frame.GetDockArt().GetMetric(aui.AUI_DOCKART_CAPTION_SIZE)) - s3.Add((1, 1), 1, wx.EXPAND) - s3.Add(wx.StaticText(self, -1, "Caption Size:")) - s3.Add(self._caption_size) -@@ -807,9 +807,9 @@ class ProgressGauge(wx.Window): - - # We take the percent way of the colour from colour -> white - i = percent -- r = colour.Red() + ((i*rd*100)/high)/100 -- g = colour.Green() + ((i*gd*100)/high)/100 -- b = colour.Blue() + ((i*bd*100)/high)/100 -+ r = colour.Red() + ((i*rd*100)//high)//100 -+ g = colour.Green() + ((i*gd*100)//high)//100 -+ b = colour.Blue() + ((i*bd*100)//high)//100 - - return wx.Colour(r, g, b) - -@@ -826,10 +826,10 @@ class ProgressGauge(wx.Window): - x, y, width, height = clientRect - x, width = self._pos, interval - -- gradientRect.SetHeight(gradientRect.GetHeight()/2) -+ gradientRect.SetHeight(gradientRect.GetHeight()//2) - topStart, topEnd = self._topStartColour, self._topEndColour - -- rc1 = wx.Rect(x, y, width, height/2) -+ rc1 = wx.Rect(int(x), y, int(width), height//2) - path1 = self.GetPath(gc, rc1, 8) - br1 = gc.CreateLinearGradientBrush(x, y, x, y+height/2, topStart, topEnd) - gc.SetBrush(br1) -@@ -845,14 +845,14 @@ class ProgressGauge(wx.Window): - - bottomStart, bottomEnd = self._bottomStartColour, self._bottomEndColour - -- rc3 = wx.Rect(x, y+height/2, width, height/2) -+ rc3 = wx.Rect(int(x), y+height//2, int(width), height//2) - path3 = self.GetPath(gc, rc3, 8) - br3 = gc.CreateLinearGradientBrush(x, y+height/2, x, y+height, bottomStart, bottomEnd) - gc.SetBrush(br3) - gc.FillPath(path3) #draw main - - path4 = gc.CreatePath() -- path4.AddRectangle(x, y+height/2, width, 8) -+ path4.AddRectangle(x, y+height//2, width, 8) - path4.CloseSubpath() - gc.SetBrush(br3) - gc.FillPath(path4) -@@ -2613,7 +2613,7 @@ class AuiFrame(wx.Frame): - flex.Add(wx.TextCtrl(panel, -1, "", wx.DefaultPosition, wx.Size(100, -1)), - 1, wx.ALL|wx.ALIGN_CENTRE, 5) - flex.Add(wx.StaticText(panel, -1, "wxSpinCtrl:"), 0, wx.ALL|wx.ALIGN_CENTRE, 5) -- flex.Add(wx.SpinCtrl(panel, -1, "5", wx.DefaultPosition, wx.Size(100, -1), -+ flex.Add(wx.SpinCtrl(panel, -1, "5", wx.DefaultPosition, wx.DefaultSize, - wx.SP_ARROW_KEYS, 5, 50, 5), 0, wx.ALL|wx.ALIGN_CENTRE, 5) - flex.Add((5, 5)) - flex.Add((5, 5)) ---- a/demo/agw/MacLargeDemo.py -+++ b/demo/agw/MacLargeDemo.py -@@ -223,12 +223,12 @@ class MacRenderer(object): - mdc.SelectObject(wx.NullBitmap) - - # Center the progress bar vertically in the box supplied -- y = y + (h - PIPE_HEIGHT)/2 -+ y = y + (h - PIPE_HEIGHT)//2 - - if percent == 0: - middle = 0 - else: -- middle = (w * percent)/100 -+ middle = int((w * percent)/100) - - if w < 1: - return ---- a/demo/agw/PeakMeter.py -+++ b/demo/agw/PeakMeter.py -@@ -149,10 +149,10 @@ class PeakMeterCtrlDemo(wx.Panel): - - def OnStart(self, event): - -- self.timer.Start(1000/2) # 2 fps -+ self.timer.Start(1000//2) # 2 fps - -- self.vertPeak.Start(1000/18) # 18 fps -- self.horzPeak.Start(1000/20) # 20 fps -+ self.vertPeak.Start(1000//18) # 18 fps -+ self.horzPeak.Start(1000//20) # 20 fps - - - def OnStop(self, event): ---- a/demo/agw/PersistentControls.py -+++ b/demo/agw/PersistentControls.py -@@ -234,7 +234,7 @@ class PersistentFrame1(wx.Frame): - sizer_1.Add(label_1, 0, wx.ALL, 5) - sizer_1.Add(combo, 0, wx.LEFT|wx.RIGHT, 5) - sizer_1.Add((20, 20), 1) -- box2.Add(sizer_1, 1, wx.EXPAND|wx.ALIGN_CENTER, 0) -+ box2.Add(sizer_1, 1, wx.EXPAND, 0) - box2.Add((0, 0), 1, 1) - - otherPanel.SetSizer(box2) ---- a/demo/agw/RibbonBar.py -+++ b/demo/agw/RibbonBar.py -@@ -799,7 +799,7 @@ class RibbonFrame(wx.Frame): - (c.Blue() + 192) % 256) - - dc.SetTextForeground(foreground) -- dc.DrawText(colour, (iWidth - size.GetWidth() + 1) / 2, (iHeight - size.GetHeight()) / 2) -+ dc.DrawText(colour, (iWidth - size.GetWidth() + 1) // 2, (iHeight - size.GetHeight()) // 2) - dc.SelectObjectAsSource(wx.NullBitmap) - - item = gallery.Append(bitmap, wx.ID_ANY) ---- a/demo/agw/SpeedMeter.py -+++ b/demo/agw/SpeedMeter.py -@@ -418,7 +418,7 @@ class SpeedMeterDemo(wx.Panel): - bsizer3 = wx.BoxSizer(wx.VERTICAL) - - hsizer3 = wx.BoxSizer(wx.HORIZONTAL) -- sc = wx.SpinCtrl(panel3, -1, size=(60,20)) -+ sc = wx.SpinCtrl(panel3, -1) - sc.SetRange(1, 250) - sc.SetValue(50) - ---- a/demo/agw/SuperToolTip.py -+++ b/demo/agw/SuperToolTip.py -@@ -43,7 +43,7 @@ class SuperToolTipDemo(wx.Frame): - self.topColourPicker = wx.ColourPickerCtrl(self.mainPanel, colour=wx.WHITE) - system = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION) - r, g, b, a = system -- self.middleColourPicker = wx.ColourPickerCtrl(self.mainPanel, colour=wx.Colour((255-r)/2, (255-g)/2, (255-b)/2)) -+ self.middleColourPicker = wx.ColourPickerCtrl(self.mainPanel, colour=wx.Colour((255-r)//2, (255-g)//2, (255-b)//2)) - self.bottomColourPicker = wx.ColourPickerCtrl(self.mainPanel, colour=system) - self.headerCheck = wx.CheckBox(self.mainPanel, -1, "Show Header") - self.headerText = wx.TextCtrl(self.mainPanel, -1, "Merge And Center") -@@ -233,7 +233,6 @@ class SuperToolTipDemo(wx.Frame): - frameSizer.Add(self.mainPanel, 1, wx.EXPAND, 0) - self.SetSizer(frameSizer) - frameSizer.Layout() -- frameSizer.Fit(self) - self.Layout() - - wx.CallAfter(mainSizer.Layout) ---- a/demo/agw/ThumbDemoConfig.py -+++ b/demo/agw/ThumbDemoConfig.py -@@ -4,6 +4,7 @@ import wx - import os - import images - -+import wx.lib.agw.scrolledthumbnail as TC - from wx.lib.agw.scrolledthumbnail import (ScrolledThumbnail, - Thumb, - NativeImageHandler, ---- a/demo/agw/UltimateReportDemo.py -+++ b/demo/agw/UltimateReportDemo.py -@@ -216,7 +216,7 @@ class UltimateRenderer_1(object): - mdc.SetFont(wx.Font(8, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)) - text = "%d Mb"%self.progressValue - textWidth, dummy = mdc.GetTextExtent(text) -- mdc.DrawText(text, rect.width/2 - textWidth/2, rect.height/2 - dummy/2) -+ mdc.DrawText(text, rect.width//2 - textWidth//2, rect.height//2 - dummy//2) - dc.SetClippingRegion(rect.x, rect.y, rect.width, rect.height) - dc.Blit(rect.x+3, rect.y, rect.width-6, rect.height, mdc, 0, 0) - dc.DestroyClippingRegion() -@@ -279,12 +279,12 @@ class UltimateRenderer_1(object): - mdc.SelectObject(wx.NullBitmap) - - # Center the progress bar vertically in the box supplied -- y = y + (h - PIPE_HEIGHT)/2 -+ y = y + (h - PIPE_HEIGHT)//2 - - if percent == 0: - middle = 0 - else: -- middle = (w * percent)/100 -+ middle = (w * percent)//100 - - if middle == 0: # not started - bitmap = self.REMAINING_BITMAP.GetSubBitmap((1, 0, w, PIPE_HEIGHT)) -@@ -335,7 +335,7 @@ class UltimateRenderer_2(object): - colours = [wx.RED, wx.WHITE, wx.GREEN, wx.Colour("SKY BLUE")] - w, h = dc.GetTextExtent("Hg") - x = rect.x + 1 -- y = rect.y + rect.height/2 - h/2 -+ y = rect.y + rect.height//2 - h//2 - - for ch in self.text: - dc.SetTextForeground(random.choice(colours)) ---- a/demo/agw/Windows7Explorer_Contents.py -+++ b/demo/agw/Windows7Explorer_Contents.py -@@ -127,13 +127,13 @@ class FirstColumnRenderer(object): - """Draw a custom progress bar using double buffering to prevent flicker""" - - bmpWidth, bmpHeight = self.icon.GetWidth(), self.icon.GetHeight() -- dc.DrawIcon(self.icon, rect.x+5, rect.y+(rect.height-bmpHeight)/2) -+ dc.DrawIcon(self.icon, rect.x+5, rect.y+(rect.height-bmpHeight)//2) - - dc.SetFont(self.normalFont) - - textWidth, textHeight = dc.GetTextExtent(self.text) - dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNTEXT)) -- dc.DrawText(self.text, rect.x+bmpWidth+10, rect.y+(rect.height - textHeight)/4) -+ dc.DrawText(self.text, rect.x+bmpWidth+10, rect.y+(rect.height - textHeight)//4) - - if not self.description: - return -@@ -144,10 +144,10 @@ class FirstColumnRenderer(object): - textWidth, textHeight = dc.GetTextExtent("Type: " + self.description) - - dc.SetTextForeground(self.greyColour) -- dc.DrawText("Type: ", rect.x+bmpWidth+10, rect.y+3*(rect.height - textHeight)/4) -+ dc.DrawText("Type: ", rect.x+bmpWidth+10, rect.y+3*(rect.height - textHeight)//4) - - dc.SetTextForeground(wx.BLACK) -- dc.DrawText(self.description, rect.x+bmpWidth+dummy1+10, rect.y+3*(rect.height - textHeight)/4) -+ dc.DrawText(self.description, rect.x+bmpWidth+dummy1+10, rect.y+3*(rect.height - textHeight)//4) - - - def GetLineHeight(self): -@@ -207,10 +207,10 @@ class SecondColumnRenderer(object): - textWidth, textHeight = dc.GetTextExtent("Date modified: " + date) - - dc.SetTextForeground(self.greyColour) -- dc.DrawText("Date modified: ", rect.x+5, rect.y+(rect.height - textHeight)/4) -+ dc.DrawText("Date modified: ", rect.x+5, rect.y+(rect.height - textHeight)//4) - - dc.SetTextForeground(wx.BLACK) -- dc.DrawText(date, rect.x+dummy1+5, rect.y+(rect.height - textHeight)/4) -+ dc.DrawText(date, rect.x+dummy1+5, rect.y+(rect.height - textHeight)//4) - - if not self.size: - return -@@ -218,10 +218,10 @@ class SecondColumnRenderer(object): - dummy1, dummy2= dc.GetTextExtent("Size: ") - - dc.SetTextForeground(self.greyColour) -- dc.DrawText("Size: ", rect.x+5, rect.y+3*(rect.height - textHeight)/4) -+ dc.DrawText("Size: ", rect.x+5, rect.y+3*(rect.height - textHeight)//4) - - dc.SetTextForeground(wx.BLACK) -- dc.DrawText(self.size, rect.x+dummy1+5, rect.y+3*(rect.height - textHeight)/4) -+ dc.DrawText(self.size, rect.x+dummy1+5, rect.y+3*(rect.height - textHeight)//4) - - - def GetLineHeight(self): ---- a/demo/agw/ZoomBar.py -+++ b/demo/agw/ZoomBar.py -@@ -55,7 +55,7 @@ class TestPanel(wx.Panel): - reflections = glob.glob(bitmapDir + "/*96Flip40.png") - - separatorImage = bitmapDir + "/separator.gif" -- separatorReflection = bitmapDir + "/separatorFlip.png" -+ separatorReflection = bitmapDir + "/separatorflip.png" - count = 0 - - for std, ref in zip(standard, reflections): ---- a/wx/lib/agw/advancedsplash.py -+++ b/wx/lib/agw/advancedsplash.py -@@ -438,7 +438,7 @@ class AdvancedSplash(wx.Frame): - - if font is None: - self._textfont = wx.Font(1, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False) -- self._textsize = 10.0 -+ self._textsize = 10 - self._textfont.SetPointSize(self._textsize) - else: - self._textfont = font ---- a/wx/lib/agw/aui/auibook.py -+++ b/wx/lib/agw/aui/auibook.py -@@ -3452,8 +3452,8 @@ class AuiNotebook(wx.Panel): - # should happen around the middle - if tab_ctrl_count < 2: - new_split_size = self.GetClientSize() -- new_split_size.x /= 2 -- new_split_size.y /= 2 -+ new_split_size.x //= 2 -+ new_split_size.y //= 2 - - else: - ---- a/wx/lib/agw/balloontip.py -+++ b/wx/lib/agw/balloontip.py -@@ -615,7 +615,7 @@ class BalloonTip(object): - if delay < 1: - raise Exception("\nERROR: Delay Time For BalloonTip Creation Should Be Greater Than 1 ms") - -- self._startdelaytime = float(delay) -+ self._startdelaytime = int(delay) - - - def GetStartDelay(self): -@@ -640,7 +640,7 @@ class BalloonTip(object): - if delay < 1: - raise Exception("\nERROR: Delay Time For BalloonTip Destruction Should Be Greater Than 1 ms") - -- self._enddelaytime = float(delay) -+ self._enddelaytime = int(delay) - - - def GetEndDelay(self): ---- a/wx/lib/agw/flatmenu.py -+++ b/wx/lib/agw/flatmenu.py -@@ -736,8 +736,8 @@ class FMRenderer(object): - """ - - dcsaver = DCSaver(dc) -- sepRect1 = wx.Rect(xCoord + textX, yCoord + 1, sepWidth/2, 1) -- sepRect2 = wx.Rect(xCoord + textX + sepWidth/2, yCoord + 1, sepWidth/2-1, 1) -+ sepRect1 = wx.Rect(xCoord + textX, yCoord + 1, sepWidth//2, 1) -+ sepRect2 = wx.Rect(xCoord + textX + sepWidth//2, yCoord + 1, sepWidth//2-1, 1) - - artMgr = ArtManager.Get() - backColour = artMgr.GetMenuFaceColour() -@@ -817,11 +817,11 @@ class FMRenderer(object): - imgWidth = bmp.GetWidth() - - if imageMarginX == 0: -- xx = rect.x + (leftMarginWidth - imgWidth)/2 -+ xx = rect.x + (leftMarginWidth - imgWidth)//2 - else: -- xx = rect.x + ((leftMarginWidth - rect.height) - imgWidth)/2 + rect.height -+ xx = rect.x + ((leftMarginWidth - rect.height) - imgWidth)//2 + rect.height - -- yy = rect.y + (rect.height - imgHeight)/2 -+ yy = rect.y + (rect.height - imgHeight)//2 - dc.DrawBitmap(bmp, xx, yy, True) - - if item.GetKind() == wx.ITEM_CHECK: -@@ -837,7 +837,7 @@ class FMRenderer(object): - if not selected and self.highlightCheckAndRadio: - self.DrawButton(dc, rr, ControlFocus) - -- dc.DrawBitmap(item._checkMarkBmp, rr.x + (rr.width - 16)/2, rr.y + (rr.height - 16)/2, True) -+ dc.DrawBitmap(item._checkMarkBmp, rr.x + (rr.width - 16)//2, rr.y + (rr.height - 16)//2, True) - - if item.GetKind() == wx.ITEM_RADIO: - -@@ -852,7 +852,7 @@ class FMRenderer(object): - if not selected and self.highlightCheckAndRadio: - self.DrawButton(dc, rr, ControlFocus) - -- dc.DrawBitmap(item._radioMarkBmp, rr.x + (rr.width - 16)/2, rr.y + (rr.height - 16)/2, True) -+ dc.DrawBitmap(item._radioMarkBmp, rr.x + (rr.width - 16)//2, rr.y + (rr.height - 16)//2, True) - - # Draw text - without accelerators - text = item.GetLabel() -@@ -890,7 +890,7 @@ class FMRenderer(object): - w3, dummy = dc.GetTextExtent(text3) - - posx = xCoord + textX + borderXSize -- posy = (itemHeight - h)/2 + yCoord -+ posy = (itemHeight - h)//2 + yCoord - - # Draw first part - dc.DrawText(text1, posx, posy) -@@ -912,7 +912,7 @@ class FMRenderer(object): - else: - - w, h = dc.GetTextExtent(text) -- dc.DrawText(text, xCoord + textX + borderXSize, (itemHeight - h)/2 + yCoord) -+ dc.DrawText(text, xCoord + textX + borderXSize, (itemHeight - h)//2 + yCoord) - - - # Now draw accelerator -@@ -920,7 +920,7 @@ class FMRenderer(object): - if item.GetAccelString(): - - accelWidth, accelHeight = dc.GetTextExtent(item.GetAccelString()) -- dc.DrawText(item.GetAccelString(), xCoord + rightMarginX - accelWidth, (itemHeight - accelHeight)/2 + yCoord) -+ dc.DrawText(item.GetAccelString(), xCoord + rightMarginX - accelWidth, (itemHeight - accelHeight)//2 + yCoord) - - # Check if this item has sub-menu - if it does, draw - # right arrow on the right margin -@@ -932,7 +932,7 @@ class FMRenderer(object): - - xx = xCoord + rightMarginX + borderXSize - rr = wx.Rect(xx, rect.y + 1, rect.height-2, rect.height-2) -- dc.DrawBitmap(rightArrowBmp, rr.x + 4, rr.y +(rr.height-16)/2, True) -+ dc.DrawBitmap(rightArrowBmp, rr.x + 4, rr.y +(rr.height-16)//2, True) - - - def DrawMenuBarButton(self, dc, rect, state): -@@ -1142,7 +1142,7 @@ class FMRenderer(object): - # Get the menu item rect - textWidth, textHeight = dc.GetTextExtent(fixedText) - #rect = wx.Rect(posx+menubar._spacer/2, posy, textWidth, textHeight) -- rect = wx.Rect(posx+padding/2, posy, textWidth, textHeight) -+ rect = wx.Rect(posx+padding//2, posy, textWidth, textHeight) - - # Can we draw more?? - # the +DROP_DOWN_ARROW_WIDTH is the width of the drop down arrow -@@ -1172,7 +1172,7 @@ class FMRenderer(object): - dc.SetTextForeground(textColour) - - ww, hh = dc.GetTextExtent(labelOnly) -- textOffset = (rect.width - ww) / 2 -+ textOffset = (rect.width - ww) // 2 - - if not menubar._isLCD and item.GetTextBitmap().IsOk() and not selected: - dc.DrawBitmap(item.GetTextBitmap(), rect.x, rect.y, True) -@@ -1505,8 +1505,8 @@ class FMRendererMSOffice2007(FMRenderer) - baseColour = colour - - # Define the middle points -- leftPt = wx.Point(rect.x, rect.y + (rect.height / 2)) -- rightPt = wx.Point(rect.x + rect.width-1, rect.y + (rect.height / 2)) -+ leftPt = wx.Point(rect.x, rect.y + (rect.height // 2)) -+ rightPt = wx.Point(rect.x + rect.width-1, rect.y + (rect.height // 2)) - - # Define the top region - top = wx.Rect((rect.GetLeft(), rect.GetTop()), rightPt) -@@ -1572,11 +1572,11 @@ class FMRendererMSOffice2007(FMRenderer) - - factor = artMgr.GetMenuBgFactor() - -- leftPt1 = wx.Point(rect.x, rect.y + (rect.height / factor)) -- leftPt2 = wx.Point(rect.x, rect.y + (rect.height / factor)*(factor-1)) -+ leftPt1 = wx.Point(rect.x, rect.y + (rect.height // factor)) -+ leftPt2 = wx.Point(rect.x, rect.y + (rect.height // factor)*(factor-1)) - -- rightPt1 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)) -- rightPt2 = wx.Point(rect.x + rect.width, rect.y + (rect.height / factor)*(factor-1)) -+ rightPt1 = wx.Point(rect.x + rect.width, rect.y + (rect.height // factor)) -+ rightPt2 = wx.Point(rect.x + rect.width, rect.y + (rect.height // factor)*(factor-1)) - - # Define the top region - topReg = [wx.Point() for ii in range(7)] -@@ -2707,7 +2707,7 @@ class FlatMenuBar(wx.Panel): - elif tbItem.IsCustomControl(): - control = tbItem.GetCustomControl() - ctrlSize = control.GetSize() -- ctrlPos = wx.Point(xx, rect.y + (rect.height - ctrlSize.y)/2) -+ ctrlPos = wx.Point(xx, rect.y + (rect.height - ctrlSize.y)//2) - if control.GetPosition() != ctrlPos: - control.SetPosition(ctrlPos) - -@@ -2727,9 +2727,9 @@ class FlatMenuBar(wx.Panel): - # Draw the toolbar image - if bmp.IsOk(): - -- x = xx - self._toolbarSpacer/2 -+ x = xx - self._toolbarSpacer//2 - #y = rect.y + (rect.height - bmp.GetHeight())/2 - 1 -- y = rect.y + self._toolbarMargin/2 -+ y = rect.y + self._toolbarMargin//2 - - buttonRect = wx.Rect(x, y, highlight_width, highlight_height) - -@@ -2745,8 +2745,8 @@ class FlatMenuBar(wx.Panel): - else: - self._tbButtons[i]._state = ControlNormal - -- imgx = buttonRect.x + (buttonRect.width - bmp.GetWidth())/2 -- imgy = buttonRect.y + (buttonRect.height - bmp.GetHeight())/2 -+ imgx = buttonRect.x + (buttonRect.width - bmp.GetWidth())//2 -+ imgy = buttonRect.y + (buttonRect.height - bmp.GetHeight())//2 - - if self._tbButtons[i]._state == ControlFocus and not self._tbButtons[i]._tbItem.IsSelected(): - -@@ -2827,8 +2827,8 @@ class FlatMenuBar(wx.Panel): - dropArrowBmp = self.GetRenderer()._bitmaps["arrow_down"] - - # Calc the image coordinates -- xx = rect.x + (DROP_DOWN_ARROW_WIDTH - dropArrowBmp.GetWidth())/2 -- yy = rect.y + (rect.height - dropArrowBmp.GetHeight())/2 -+ xx = rect.x + (DROP_DOWN_ARROW_WIDTH - dropArrowBmp.GetWidth())//2 -+ yy = rect.y + (rect.height - dropArrowBmp.GetHeight())//2 - - dc.DrawBitmap(dropArrowBmp, xx, yy + self._spacer, True) - self._dropDownButtonState = state -@@ -3269,8 +3269,8 @@ class FlatMenuBar(wx.Panel): - - # draw the bitmap over the highlight - buttonRect = wx.Rect(*rect) -- x = rect.x + (buttonRect.width - self._tbButtons[idx]._tbItem.GetBitmap().GetWidth())/2 -- y = rect.y + (buttonRect.height - self._tbButtons[idx]._tbItem.GetBitmap().GetHeight())/2 -+ x = rect.x + (buttonRect.width - self._tbButtons[idx]._tbItem.GetBitmap().GetWidth())//2 -+ y = rect.y + (buttonRect.height - self._tbButtons[idx]._tbItem.GetBitmap().GetHeight())//2 - - if state == ControlFocus: - -@@ -3784,7 +3784,7 @@ class FlatMenuBar(wx.Panel): - pn.Name("flat_menu_bar") - pn.Caption("Menu Bar") - pn.Top() -- pn.MinSize(wx.Size(xx/2, self._barHeight)) -+ pn.MinSize(wx.Size(xx//2, self._barHeight)) - pn.LeftDockable(False) - pn.RightDockable(False) - pn.ToolbarPane() -@@ -3997,8 +3997,8 @@ class FlatMenuButton(object): - """ - - rect = wx.Rect(self._pos, self._size) -- xx = rect.x + (rect.width - self._normalBmp.GetWidth())/2 -- yy = rect.y + (rect.height - self._normalBmp.GetHeight())/2 -+ xx = rect.x + (rect.width - self._normalBmp.GetWidth())//2 -+ yy = rect.y + (rect.height - self._normalBmp.GetHeight())//2 - - self._parent.GetRenderer().DrawScrollButton(dc, rect, self._state) - dc.DrawBitmap(self._normalBmp, xx, yy, True) ---- a/wx/lib/agw/flatnotebook.py -+++ b/wx/lib/agw/flatnotebook.py -@@ -858,9 +858,9 @@ def PaintStraightGradientBox(dc, rect, s - - for i in range(high+1): - -- r = startColour.Red() + ((i*rd*100)/high)/100 -- g = startColour.Green() + ((i*gd*100)/high)/100 -- b = startColour.Blue() + ((i*bd*100)/high)/100 -+ r = startColour.Red() + ((i*rd*100)//high)//100 -+ g = startColour.Green() + ((i*gd*100)//high)//100 -+ b = startColour.Blue() + ((i*bd*100)//high)//100 - - p = wx.Pen(wx.Colour(r, g, b)) - dc.SetPen(p) -@@ -2630,9 +2630,9 @@ class FNBRendererDefault(FNBRenderer): - imageYCoord = (pc.HasAGWFlag(FNB_BOTTOM) and [6] or [8])[0] - - if hasImage: -- textOffset = 2*pc._pParent._nPadding + 16 + shapePoints/2 -+ textOffset = 2*pc._pParent._nPadding + 16 + shapePoints//2 - else: -- textOffset = pc._pParent._nPadding + shapePoints/2 -+ textOffset = pc._pParent._nPadding + shapePoints//2 - - textOffset += 2 - ---- a/wx/lib/agw/floatspin.py -+++ b/wx/lib/agw/floatspin.py -@@ -336,7 +336,7 @@ class FloatSpin(wx.Control): - """ - - def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, -- size=(95,-1), style=0, value=0.0, min_val=None, max_val=None, -+ size=wx.DefaultSize, style=0, value=0.0, min_val=None, max_val=None, - increment=1.0, digits=-1, agwStyle=FS_LEFT, - name="FloatSpin"): - """ ---- a/wx/lib/agw/gradientbutton.py -+++ b/wx/lib/agw/gradientbutton.py -@@ -412,14 +412,14 @@ class GradientButton(wx.Control): - - x, y, width, height = clientRect - -- gradientRect.SetHeight(gradientRect.GetHeight()/2 + ((capture==self and [1] or [0])[0])) -+ gradientRect.SetHeight(gradientRect.GetHeight()//2 + ((capture==self and [1] or [0])[0])) - if capture != self: - if self._mouseAction == HOVER: - topStart, topEnd = self.LightColour(self._topStartColour, 10), self.LightColour(self._topEndColour, 10) - else: - topStart, topEnd = self._topStartColour, self._topEndColour - -- rc1 = wx.Rect(x, y, width, height/2) -+ rc1 = wx.Rect(x, y, width, height//2) - path1 = self.GetPath(gc, rc1, 8) - br1 = gc.CreateLinearGradientBrush(x, y, x, y+height/2, topStart, topEnd) - gc.SetBrush(br1) -@@ -448,7 +448,7 @@ class GradientButton(wx.Control): - else: - bottomStart, bottomEnd = self._bottomStartColour, self._bottomEndColour - -- rc3 = wx.Rect(x, y+height/2, width, height/2) -+ rc3 = wx.Rect(x, y+height//2, width, height//2) - path3 = self.GetPath(gc, rc3, 8) - br3 = gc.CreateLinearGradientBrush(x, y+height/2, x, y+height, bottomStart, bottomEnd) - gc.SetBrush(br3) -@@ -463,7 +463,7 @@ class GradientButton(wx.Control): - shadowOffset = 0 - else: - -- rc2 = wx.Rect(x+1, gradientRect.height/2, gradientRect.width, gradientRect.height) -+ rc2 = wx.Rect(x+1, gradientRect.height//2, gradientRect.width, gradientRect.height) - path2 = self.GetPath(gc, rc2, 8) - gc.SetPen(wx.Pen(self._pressedBottomColour)) - gc.SetBrush(wx.Brush(self._pressedBottomColour)) ---- a/wx/lib/agw/hypertreelist.py -+++ b/wx/lib/agw/hypertreelist.py -@@ -3381,7 +3381,7 @@ class TreeListMainWindow(CustomTreeCtrl) - - if not self.HasAGWFlag(wx.TR_NO_LINES) and children: - last_child = children[-1] -- Y1 = last_child.GetY() + last_child.GetHeight() / 2 -+ Y1 = last_child.GetY() + last_child.GetHeight() // 2 - dc.DrawLine(x, oldY, x, Y1) - - return y, x_maincol ---- a/wx/lib/agw/knobctrl.py -+++ b/wx/lib/agw/knobctrl.py -@@ -325,7 +325,7 @@ class BufferedWindow(wx.Window): - memory.Clear() - - minradius = min(0.9*self.Width/2.0, 0.9*self.Height/2.0) -- memory.DrawCircle(self.Width//2, self.Height//2, minradius) -+ memory.DrawCircle(self.Width//2, self.Height//2, int(minradius)) - memory.SelectObject(wx.NullBitmap) - self._region = wx.Region(self._Buffer, self.GetBackgroundColour()) - self._minradius = minradius -@@ -645,8 +645,8 @@ class KnobCtrl(BufferedWindow): - dxi = math.cos(angle)*((width - xshift + tagLen - 6)/2.0 - tagLen) - dyi = math.sin(angle)*((height - yshift + tagLen - 6)/2.0 - tagLen) - -- dc.DrawLine(width//2 - sxi, height//2 - syi, -- width//2 - dxi, height//2 - dyi) -+ dc.DrawLine(int(width//2 - sxi), int(height//2 - syi), -+ int(width//2 - dxi), int(height//2 - dyi)) - - - def DrawDiagonalGradient(self, dc, size): -@@ -759,8 +759,8 @@ class KnobCtrl(BufferedWindow): - p1 = wx.Pen(self.OffsetColour(pencolour, -70), 2) - p2 = wx.Pen(self.OffsetColour(pencolour, 10), 1) - -- pt1 = wx.Point(cx-r*math.sqrt(2)/2.0, cy+r*math.sqrt(2)/2.0) -- pt2 = wx.Point(cx+r*math.sqrt(2)/2.0, cy-r*math.sqrt(2)/2.0) -+ pt1 = wx.Point(int(cx-r*math.sqrt(2)/2.0), int(cy+r*math.sqrt(2)/2.0)) -+ pt2 = wx.Point(int(cx+r*math.sqrt(2)/2.0), int(cy-r*math.sqrt(2)/2.0)) - - dc.SetPen(p2) - dc.DrawArc(pt1, pt2, (cx, cy)) -@@ -779,7 +779,7 @@ class KnobCtrl(BufferedWindow): - radius = 0.9*min(size.x, size.y)/2.0 - dc.SetBrush(wx.TRANSPARENT_BRUSH) - dc.SetPen(wx.Pen(self._boundingcolour)) -- dc.DrawCircle(self.Width//2, self.Height//2, radius) -+ dc.DrawCircle(self.Width//2, self.Height//2, int(radius)) - - - def CircleCoords(self, radius, angle, centerX, centerY): ---- a/wx/lib/agw/labelbook.py -+++ b/wx/lib/agw/labelbook.py -@@ -1376,13 +1376,13 @@ class ImageContainer(ImageContainerBase) - - if bUseYcoord: - -- imgXcoord = self._nImgSize / 2 -- imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [pos + self._nImgSize / 2] or [pos + imgTopPadding])[0] -+ imgXcoord = self._nImgSize // 2 -+ imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [pos + self._nImgSize // 2] or [pos + imgTopPadding])[0] - - else: - -- imgXcoord = pos + (rectWidth / 2) - (self._nImgSize / 2) -- imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [self._nImgSize / 2] or [imgTopPadding])[0] -+ imgXcoord = pos + (rectWidth // 2) - (self._nImgSize // 2) -+ imgYcoord = (style & INB_SHOW_ONLY_IMAGES and [self._nImgSize // 2] or [imgTopPadding])[0] - - self._ImageList.Draw(self._pagesInfoVec[i].GetImageIndex(), dc, - imgXcoord, imgYcoord, -@@ -1408,15 +1408,15 @@ class ImageContainer(ImageContainerBase) - - if bUseYcoord: - -- textOffsetX = ((rectWidth - textWidth) / 2 ) -+ textOffsetX = ((rectWidth - textWidth) // 2 ) - textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [pos + self._nImgSize + imgTopPadding + 3] or \ -- [pos + ((self._nImgSize * 2 - textHeight) / 2 )])[0] -+ [pos + ((self._nImgSize * 2 - textHeight) // 2 )])[0] - - else: - -- textOffsetX = (rectWidth - textWidth) / 2 + pos + nTextPaddingLeft -+ textOffsetX = (rectWidth - textWidth) // 2 + pos + nTextPaddingLeft - textOffsetY = (not style & INB_SHOW_ONLY_TEXT and [self._nImgSize + imgTopPadding + 3] or \ -- [((self._nImgSize * 2 - textHeight) / 2 )])[0] -+ [((self._nImgSize * 2 - textHeight) // 2 )])[0] - - dc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)) - dc.DrawText(fixedText, textOffsetX, textOffsetY) -@@ -1591,8 +1591,8 @@ class LabelContainer(ImageContainerBase) - # Draw gradient in the background area - startColour = self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR] - endColour = ArtManager.Get().LightColour(self._coloursMap[INB_TAB_AREA_BACKGROUND_COLOUR], 50) -- ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(0, 0, size.x / 2, size.y), startColour, endColour, False) -- ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(size.x / 2, 0, size.x / 2, size.y), endColour, startColour, False) -+ ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(0, 0, size.x // 2, size.y), startColour, endColour, False) -+ ArtManager.Get().PaintStraightGradientBox(dc, wx.Rect(size.x // 2, 0, size.x // 2, size.y), endColour, startColour, False) - - else: - -@@ -1638,7 +1638,7 @@ class LabelContainer(ImageContainerBase) - - if self.HasAGWFlag(INB_SHOW_ONLY_TEXT): - font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) -- font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple()) -+ font.SetPointSize(int(font.GetPointSize() * self.GetParent().GetFontSizeMultiple())) - - if self.GetParent().GetFontBold(): - font.SetWeight(wx.FONTWEIGHT_BOLD) -@@ -1954,7 +1954,7 @@ class LabelContainer(ImageContainerBase) - - # Redraw the text with underlined font - underLinedFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) -- underLinedFont.SetPointSize(underLinedFont.GetPointSize() * self.GetParent().GetFontSizeMultiple()) -+ underLinedFont.SetPointSize(int(underLinedFont.GetPointSize() * self.GetParent().GetFontSizeMultiple())) - if self.GetParent().GetFontBold(): - underLinedFont.SetWeight(wx.FONTWEIGHT_BOLD) - elif self.HasAGWFlag(INB_BOLD_TAB_SELECTION) and selected: -@@ -2050,7 +2050,7 @@ class LabelContainer(ImageContainerBase) - imgRect = wx.Rect(*rect) - - font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) -- font.SetPointSize(font.GetPointSize() * self.GetParent().GetFontSizeMultiple()) -+ font.SetPointSize(int(font.GetPointSize() * self.GetParent().GetFontSizeMultiple())) - - if self.GetParent().GetFontBold(): - font.SetWeight(wx.FONTWEIGHT_BOLD) -@@ -2069,7 +2069,7 @@ class LabelContainer(ImageContainerBase) - - # Text bounding rectangle - textRect.x += nPadding -- textRect.y = rect.y + (rect.height - h)/2 -+ textRect.y = rect.y + (rect.height - h)//2 - textRect.width = rect.width - 2 * nPadding - - if bmp.IsOk() and not self.HasAGWFlag(INB_SHOW_ONLY_TEXT): -@@ -2086,7 +2086,7 @@ class LabelContainer(ImageContainerBase) - - imgRect.x += nPadding - imgRect.width = bmp.GetWidth() -- imgRect.y = rect.y + (rect.height - bmp.GetHeight())/2 -+ imgRect.y = rect.y + (rect.height - bmp.GetHeight())//2 - imgRect.height = bmp.GetHeight() - - # Draw bounding rectangle -@@ -2496,7 +2496,7 @@ class FlatBookBase(wx.Panel): - dc = wx.MemoryDC() - dc.SelectObject(wx.Bitmap(1, 1)) - font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) -- font.SetPointSize(font.GetPointSize()*self._fontSizeMultiple) -+ font.SetPointSize(int(font.GetPointSize()*self._fontSizeMultiple)) - if self.GetFontBold() or agwStyle & INB_BOLD_TAB_SELECTION: - font.SetWeight(wx.FONTWEIGHT_BOLD) - dc.SetFont(font) ---- a/wx/lib/agw/peakmeter.py -+++ b/wx/lib/agw/peakmeter.py -@@ -784,7 +784,7 @@ class PeakMeterCtrl(wx.Control): - maxWidth = size.x*horzBands - points = [wx.Point() for i in range(2)] - points[0].y = rectPrev.GetTopRight().y - yDecal -- points[0].x = rectPrev.GetBottomLeft().x + self._meterData[vert]._falloff*maxWidth/self._maxValue -+ points[0].x = rectPrev.GetBottomLeft().x + self._meterData[vert]._falloff*maxWidth//self._maxValue - points[1].y = rectPrev.GetBottomLeft().y + yDecal - points[1].x = points[0].x - dc.SetPen(pen) ---- a/wx/lib/agw/pygauge.py -+++ b/wx/lib/agw/pygauge.py -@@ -344,7 +344,7 @@ class PyGauge(wx.Window): - c1,c2 = gradient - w = rect.width * (float(self._valueSorted[i]) / self._range) - r = copy.copy(rect) -- r.width = w -+ r.width = int(w) - dc.GradientFillLinear(r, c1, c2, wx.EAST) - else: - for i, colour in enumerate(self._barColourSorted): -@@ -352,7 +352,7 @@ class PyGauge(wx.Window): - dc.SetPen(wx.Pen(colour)) - w = rect.width * (float(self._valueSorted[i]) / self._range) - r = copy.copy(rect) -- r.width = w -+ r.width = int(w) - dc.DrawRectangle(r) - - ---- a/wx/lib/agw/ribbon/art_aui.py -+++ b/wx/lib/agw/ribbon/art_aui.py -@@ -390,7 +390,7 @@ class RibbonAUIArtProvider(RibbonMSWArtP - grad_rect = wx.Rect(*tab.rect) - grad_rect.height -= 4 - grad_rect.width -= 1 -- grad_rect.height /= 2 -+ grad_rect.height //= 2 - grad_rect.y = grad_rect.y + tab.rect.height - grad_rect.height - 1 - dc.SetBrush(self._tab_active_top_background_brush) - dc.DrawRectangle(tab.rect.x, tab.rect.y + 3, tab.rect.width - 1, grad_rect.y - tab.rect.y - 3) -@@ -401,7 +401,7 @@ class RibbonAUIArtProvider(RibbonMSWArtP - btm_rect = wx.Rect(*tab.rect) - btm_rect.height -= 4 - btm_rect.width -= 1 -- btm_rect.height /= 2 -+ btm_rect.height //= 2 - btm_rect.y = btm_rect.y + tab.rect.height - btm_rect.height - 1 - dc.SetBrush(self._tab_hover_background_brush) - dc.DrawRectangle(btm_rect.x, btm_rect.y, btm_rect.width, btm_rect.height) -@@ -434,8 +434,8 @@ class RibbonAUIArtProvider(RibbonMSWArtP - icon = tab.page.GetIcon() - if self._flags & RIBBON_BAR_SHOW_PAGE_LABELS == 0: - if icon.IsOk(): -- x = tab.rect.x + (tab.rect.width - icon.GetWidth()) / 2 -- dc.DrawBitmap(icon, x, tab.rect.y + 1 + (tab.rect.height - 1 - icon.GetHeight()) / 2, True) -+ x = tab.rect.x + (tab.rect.width - icon.GetWidth()) // 2 -+ dc.DrawBitmap(icon, x, tab.rect.y + 1 + (tab.rect.height - 1 - icon.GetHeight()) // 2, True) - - if self._flags & RIBBON_BAR_SHOW_PAGE_LABELS: - label = tab.page.GetLabel() -@@ -450,7 +450,7 @@ class RibbonAUIArtProvider(RibbonMSWArtP - offset += icon.GetWidth() + 2 - - text_width, text_height = dc.GetTextExtent(label) -- x = (tab.rect.width - 2 - text_width - offset) / 2 -+ x = (tab.rect.width - 2 - text_width - offset) // 2 - if x > 8: - x = 8 - elif x < 1: -@@ -458,7 +458,7 @@ class RibbonAUIArtProvider(RibbonMSWArtP - - width = tab.rect.width - x - 2 - x += tab.rect.x + offset -- y = tab.rect.y + (tab.rect.height - text_height) / 2 -+ y = tab.rect.y + (tab.rect.height - text_height) // 2 - - if icon.IsOk(): - dc.DrawBitmap(icon, x - offset, tab.rect.y + (tab.rect.height - icon.GetHeight()) / 2, True) -@@ -892,8 +892,8 @@ class RibbonAUIArtProvider(RibbonMSWArtP - self._page_hover_background_gradient_colour, wx.SOUTH) - - if bitmap.IsOk(): -- dc.DrawBitmap(bitmap, preview.x + (preview.width - bitmap.GetWidth()) / 2, -- preview.y + (preview.height - bitmap.GetHeight()) / 2, True) -+ dc.DrawBitmap(bitmap, preview.x + (preview.width - bitmap.GetWidth()) // 2, -+ preview.y + (preview.height - bitmap.GetHeight()) // 2, True) - - - def DrawPartialPanelBackground(self, dc, wnd, rect): -@@ -1024,7 +1024,7 @@ class RibbonAUIArtProvider(RibbonMSWArtP - dc.DrawRectangle(reduced_rect.x, reduced_rect.y, reduced_rect.width, reduced_rect.height) - btn_bitmap = bitmaps[3] - -- dc.DrawBitmap(btn_bitmap, reduced_rect.x + reduced_rect.width / 2 - 2, (rect.y + rect.height / 2) - 2, True) -+ dc.DrawBitmap(btn_bitmap, reduced_rect.x + reduced_rect.width // 2 - 2, (rect.y + rect.height // 2) - 2, True) - - - def DrawGalleryItemBackground(self, dc, wnd, rect, item): -@@ -1277,7 +1277,7 @@ class RibbonAUIArtProvider(RibbonMSWArtP - if is_split_hybrid: - dc.DrawLine(rect.x + avail_width + 1, rect.y, rect.x + avail_width + 1, rect.y + rect.height) - -- dc.DrawBitmap(self._toolbar_drop_bitmap, bg_rect.x + avail_width + 2, bg_rect.y + (bg_rect.height / 2) - 2, True) -+ dc.DrawBitmap(self._toolbar_drop_bitmap, bg_rect.x + avail_width + 2, bg_rect.y + (bg_rect.height // 2) - 2, True) - -- dc.DrawBitmap(bitmap, bg_rect.x + (avail_width - bitmap.GetWidth()) / 2, bg_rect.y + (bg_rect.height - bitmap.GetHeight()) / 2, True) -+ dc.DrawBitmap(bitmap, bg_rect.x + (avail_width - bitmap.GetWidth()) // 2, bg_rect.y + (bg_rect.height - bitmap.GetHeight()) // 2, True) - ---- a/wx/lib/agw/ribbon/art_internal.py -+++ b/wx/lib/agw/ribbon/art_internal.py -@@ -32,9 +32,9 @@ def RibbonInterpolateColour(start_colour - r = end_colour.Red() - start_colour.Red() - g = end_colour.Green() - start_colour.Green() - b = end_colour.Blue() - start_colour.Blue() -- r = start_colour.Red() + (((r * position * 100) / end_position) / 100) -- g = start_colour.Green() + (((g * position * 100) / end_position) / 100) -- b = start_colour.Blue() + (((b * position * 100) / end_position) / 100) -+ r = start_colour.Red() + (((r * position * 100) // end_position) // 100) -+ g = start_colour.Green() + (((g * position * 100) // end_position) // 100) -+ b = start_colour.Blue() + (((b * position * 100) // end_position) // 100) - - return wx.Colour(r, g, b) - -@@ -61,9 +61,9 @@ def RibbonDrawParallelGradientLines(dc, - bd = end_colour.Blue() - start_colour.Blue() - - for step in range(numsteps): -- r = start_colour.Red() + (((step*rd*100)/numsteps)/100) -- g = start_colour.Green() + (((step*gd*100)/numsteps)/100) -- b = start_colour.Blue() + (((step*bd*100)/numsteps)/100) -+ r = start_colour.Red() + (((step*rd*100)//numsteps)//100) -+ g = start_colour.Green() + (((step*gd*100)//numsteps)//100) -+ b = start_colour.Blue() + (((step*bd*100)//numsteps)//100) - - p = wx.Pen(wx.Colour(r, g, b)) - dc.SetPen(p) ---- a/wx/lib/agw/ribbon/art_msw.py -+++ b/wx/lib/agw/ribbon/art_msw.py -@@ -982,7 +982,7 @@ class RibbonMSWArtProvider(object): - background.width -= 4 - background.height -= 3 - h = background.height -- background.height /= 2 -+ background.height //= 2 - dc.GradientFillLinear(background, self._tab_hover_background_top_colour, - self._tab_hover_background_top_gradient_colour, wx.SOUTH) - -@@ -1024,9 +1024,9 @@ class RibbonMSWArtProvider(object): - if icon.IsOk(): - x = tab.rect.x + 4 - if self._flags & RIBBON_BAR_SHOW_PAGE_LABELS == 0: -- x = tab.rect.x + (tab.rect.width - icon.GetWidth()) / 2 -+ x = tab.rect.x + (tab.rect.width - icon.GetWidth()) // 2 - -- dc.DrawBitmap(icon, x, tab.rect.y + 1 + (tab.rect.height - 1 - icon.GetHeight()) / 2, True) -+ dc.DrawBitmap(icon, x, tab.rect.y + 1 + (tab.rect.height - 1 - icon.GetHeight()) // 2, True) - - if self._flags & RIBBON_BAR_SHOW_PAGE_LABELS: - label = tab.page.GetLabel() -@@ -1043,13 +1043,13 @@ class RibbonMSWArtProvider(object): - x += 3 + tab.page.GetIcon().GetWidth() - width -= 3 + tab.page.GetIcon().GetWidth() - -- y = tab.rect.y + (tab.rect.height - text_height) / 2 -+ y = tab.rect.y + (tab.rect.height - text_height) // 2 - - if width <= text_width: - dc.SetClippingRegion(x, tab.rect.y, width, tab.rect.height) - dc.DrawText(label, x, y) - else: -- dc.DrawText(label, x + (width - text_width) / 2 + 1, y) -+ dc.DrawText(label, x + (width - text_width) // 2 + 1, y) - - - def DrawTabSeparator(self, dc, wnd, rect, visibility): -@@ -1093,7 +1093,7 @@ class RibbonMSWArtProvider(object): - dc = wx.MemoryDC(self._cached_tab_separator) - self.DrawTabCtrlBackground(dc, wnd, rect) - -- x = rect.x + rect.width / 2 -+ x = rect.x + rect.width // 2 - h = float(rect.height - 1) - - r1 = self._tab_ctrl_background_brush.GetColour().Red() * (1.0 - visibility) + 0.5 -@@ -1146,7 +1146,7 @@ class RibbonMSWArtProvider(object): - - # upper_rect, lower_rect, paint_rect are all in page co-ordinates - upper_rect = wx.Rect(*background) -- upper_rect.height /= 5 -+ upper_rect.height //= 5 - - lower_rect = wx.Rect(*background) - lower_rect.y += upper_rect.height -@@ -1229,7 +1229,7 @@ class RibbonMSWArtProvider(object): - background.width -= 4 - background.height -= 2 - -- background.height /= 5 -+ background.height //= 5 - dc.GradientFillLinear(background, self._page_background_top_colour, - self._page_background_top_gradient_colour, wx.SOUTH) - -@@ -1493,10 +1493,10 @@ class RibbonMSWArtProvider(object): - - if clip_label: - clip = wx.DCClipper(dc, label_rect) -- dc.DrawText(label, label_rect.x, label_rect.y + (label_rect.GetHeight() - label_size.GetHeight()) / 2) -+ dc.DrawText(label, label_rect.x, label_rect.y + (label_rect.GetHeight() - label_size.GetHeight()) // 2) - else: -- dc.DrawText(label, label_rect.x + (label_rect.GetWidth() - label_size.GetWidth()) / 2, -- label_rect.y + (label_rect.GetHeight() - label_size.GetHeight()) / 2) -+ dc.DrawText(label, label_rect.x + (label_rect.GetWidth() - label_size.GetWidth()) // 2, -+ label_rect.y + (label_rect.GetHeight() - label_size.GetHeight()) // 2) - - if has_ext_button: - if wnd.IsExtButtonHovered(): -@@ -1577,7 +1577,7 @@ class RibbonMSWArtProvider(object): - # Divider between items and buttons - dc.DrawLine(rect.x, rect.y + rect.height - 15, rect.x + rect.width, rect.y + rect.height - 15) - -- up_btn = wx.Rect(rect.x, rect.y + rect.height - 15, rect.width / 3, 15) -+ up_btn = wx.Rect(rect.x, rect.y + rect.height - 15, rect.width // 3, 15) - down_btn = wx.Rect(up_btn.GetRight() + 1, up_btn.GetTop(), up_btn.GetWidth(), up_btn.GetHeight()) - dc.DrawLine(down_btn.GetLeft(), down_btn.GetTop(), down_btn.GetLeft(), down_btn.GetBottom()) - ext_btn = wx.Rect(down_btn.GetRight() + 1, up_btn.GetTop(), rect.width - up_btn.GetWidth() - down_btn.GetWidth() - 1, up_btn.GetHeight()) -@@ -1587,7 +1587,7 @@ class RibbonMSWArtProvider(object): - # Divider between items and buttons - dc.DrawLine(rect.x + rect.width - 15, rect.y, rect.x + rect.width - 15, rect.y + rect.height) - -- up_btn = wx.Rect(rect.x + rect.width - 15, rect.y, 15, rect.height / 3) -+ up_btn = wx.Rect(rect.x + rect.width - 15, rect.y, 15, rect.height // 3) - down_btn = wx.Rect(up_btn.GetLeft(), up_btn.GetBottom() + 1, up_btn.GetWidth(), up_btn.GetHeight()) - dc.DrawLine(down_btn.GetLeft(), down_btn.GetTop(), down_btn.GetRight(), down_btn.GetTop()) - ext_btn = wx.Rect(up_btn.GetLeft(), down_btn.GetBottom() + 1, up_btn.GetWidth(), rect.height - up_btn.GetHeight() - down_btn.GetHeight() - 1) -@@ -1633,14 +1633,14 @@ class RibbonMSWArtProvider(object): - - dc.SetPen(wx.TRANSPARENT_PEN) - dc.SetBrush(btn_top_brush) -- dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height / 2) -+ dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height // 2) - - lower = wx.Rect(*rect) -- lower.height = (lower.height + 1) / 2 -+ lower.height = (lower.height + 1) // 2 - lower.y += rect.height - lower.height - dc.GradientFillLinear(lower, btn_colour, btn_grad_colour, wx.SOUTH) - -- dc.DrawBitmap(btn_bitmap, rect.x + rect.width / 2 - 2, lower.y - 2, True) -+ dc.DrawBitmap(btn_bitmap, rect.x + rect.width // 2 - 2, lower.y - 2, True) - - - def DrawGalleryItemBackground(self, dc, wnd, rect, item): -@@ -1691,7 +1691,7 @@ class RibbonMSWArtProvider(object): - upper.x += 1 - upper.width -= 2 - upper.y += 1 -- upper.height /= 3 -+ upper.height //= 3 - dc.SetPen(wx.TRANSPARENT_PEN) - dc.SetBrush(top_brush) - dc.DrawRectangle(upper.x, upper.y, upper.width, upper.height) -@@ -1760,7 +1760,7 @@ class RibbonMSWArtProvider(object): - client_rect.x += 1 - client_rect.width -= 2 - client_rect.y += 1 -- client_rect.height = (rect.y + rect.height / 5) - client_rect.x -+ client_rect.height = (rect.y + rect.height // 5) - client_rect.x - dc.GradientFillLinear(client_rect, - self._panel_active_background_top_colour, - self._panel_active_background_top_gradient_colour, wx.SOUTH) -@@ -1785,7 +1785,7 @@ class RibbonMSWArtProvider(object): - dc.SetPen(wx.TRANSPARENT_PEN) - dc.DrawRectangle(preview.x + 1, preview.y + preview.height - 8, preview.width - 2, 7) - -- mid_pos = rect.y + rect.height / 5 - preview.y -+ mid_pos = rect.y + rect.height // 5 - preview.y - - if mid_pos < 0 or mid_pos >= preview.height: - full_rect = wx.Rect(*preview) -@@ -1816,8 +1816,8 @@ class RibbonMSWArtProvider(object): - self._page_hover_background_gradient_colour, wx.SOUTH) - - if bitmap.IsOk(): -- dc.DrawBitmap(bitmap, preview.x + (preview.width - bitmap.GetWidth()) / 2, -- preview.y + (preview.height - 7 - bitmap.GetHeight()) / 2, True) -+ dc.DrawBitmap(bitmap, preview.x + (preview.width - bitmap.GetWidth()) // 2, -+ preview.y + (preview.height - 7 - bitmap.GetHeight()) // 2, True) - - self.DrawPanelBorder(dc, preview, self._panel_border_pen, self._panel_border_gradient_pen) - self.DrawPanelBorder(dc, true_rect, self._panel_minimised_border_pen, self._panel_minimised_border_gradient_pen) -@@ -1829,20 +1829,20 @@ class RibbonMSWArtProvider(object): - - if self._flags & RIBBON_BAR_FLOW_VERTICAL: - preview.x = true_rect.x + 4 -- preview.y = true_rect.y + (true_rect.height - preview.height) / 2 -+ preview.y = true_rect.y + (true_rect.height - preview.height) // 2 - else: -- preview.x = true_rect.x + (true_rect.width - preview.width) / 2 -+ preview.x = true_rect.x + (true_rect.width - preview.width) // 2 - preview.y = true_rect.y + 4 - - dc.SetFont(self._panel_label_font) - label_width, label_height = dc.GetTextExtent(wnd.GetLabel()) - -- xpos = true_rect.x + (true_rect.width - label_width + 1) / 2 -+ xpos = true_rect.x + (true_rect.width - label_width + 1) // 2 - ypos = preview.y + preview.height + 5 - - if self._flags & RIBBON_BAR_FLOW_VERTICAL: - xpos = preview.x + preview.width + 5 -- ypos = true_rect.y + (true_rect.height - label_height) / 2 -+ ypos = true_rect.y + (true_rect.height - label_height) // 2 - - dc.SetTextForeground(self._panel_minimised_label_colour) - dc.DrawText(wnd.GetLabel(), xpos, ypos) -@@ -1851,12 +1851,12 @@ class RibbonMSWArtProvider(object): - - if self._flags & RIBBON_BAR_FLOW_VERTICAL: - xpos += label_width -- arrow_points[0] = wx.Point(xpos + 5, ypos + label_height / 2) -+ arrow_points[0] = wx.Point(xpos + 5, ypos + label_height // 2) - arrow_points[1] = arrow_points[0] + wx.Point(-3, 3) - arrow_points[2] = arrow_points[0] + wx.Point(-3, -3) - else: - ypos += label_height -- arrow_points[0] = wx.Point(true_rect.width / 2, ypos + 5) -+ arrow_points[0] = wx.Point(true_rect.width // 2, ypos + 5) - arrow_points[1] = arrow_points[0] + wx.Point(-3, -3) - arrow_points[2] = arrow_points[0] + wx.Point( 3, -3) - -@@ -1967,7 +1967,7 @@ class RibbonMSWArtProvider(object): - bg_rect.height -= 2 - - bg_rect_top = wx.Rect(*bg_rect) -- bg_rect_top.height /= 3 -+ bg_rect_top.height //= 3 - bg_rect.y += bg_rect_top.height - bg_rect.height -= bg_rect_top.height - -@@ -2043,7 +2043,7 @@ class RibbonMSWArtProvider(object): - if result == RIBBON_BUTTONBAR_BUTTON_LARGE: - - padding = 2 -- dc.DrawBitmap(bitmap_large, rect.x + (rect.width - bitmap_large.GetWidth()) / 2, -+ dc.DrawBitmap(bitmap_large, rect.x + (rect.width - bitmap_large.GetWidth()) // 2, - rect.y + padding, True) - ypos = rect.y + padding + bitmap_large.GetHeight() + padding - arrow_width = (kind == RIBBON_BUTTON_NORMAL and [0] or [8])[0] -@@ -2052,10 +2052,10 @@ class RibbonMSWArtProvider(object): - - if label_w + 2 * padding <= rect.width: - -- dc.DrawText(label, rect.x + (rect.width - label_w) / 2, ypos) -+ dc.DrawText(label, rect.x + (rect.width - label_w) // 2, ypos) - if arrow_width != 0: -- self.DrawDropdownArrow(dc, rect.x + rect.width / 2, -- ypos + (label_h * 3) / 2, -+ self.DrawDropdownArrow(dc, rect.x + rect.width // 2, -+ ypos + (label_h * 3) // 2, - self._button_bar_label_colour) - else: - breaki = len(label) -@@ -2067,17 +2067,17 @@ class RibbonMSWArtProvider(object): - label_w, label_h = dc.GetTextExtent(label_top) - - if label_w + 2 * padding <= rect.width: -- dc.DrawText(label_top, rect.x + (rect.width - label_w) / 2, ypos) -+ dc.DrawText(label_top, rect.x + (rect.width - label_w) // 2, ypos) - ypos += label_h - label_bottom = label[breaki:] - label_w, label_h = dc.GetTextExtent(label_bottom) - label_w += arrow_width -- iX = rect.x + (rect.width - label_w) / 2 -+ iX = rect.x + (rect.width - label_w) // 2 - dc.DrawText(label_bottom, iX, ypos) - - if arrow_width != 0: - self.DrawDropdownArrow(dc, iX + 2 +label_w - arrow_width, -- ypos + label_h / 2 + 1, -+ ypos + label_h // 2 + 1, - self._button_bar_label_colour) - - break -@@ -2085,14 +2085,14 @@ class RibbonMSWArtProvider(object): - elif result == RIBBON_BUTTONBAR_BUTTON_MEDIUM: - - x_cursor = rect.x + 2 -- dc.DrawBitmap(bitmap_small, x_cursor, rect.y + (rect.height - bitmap_small.GetHeight())/2, True) -+ dc.DrawBitmap(bitmap_small, x_cursor, rect.y + (rect.height - bitmap_small.GetHeight())//2, True) - x_cursor += bitmap_small.GetWidth() + 2 - label_w, label_h = dc.GetTextExtent(label) -- dc.DrawText(label, x_cursor, rect.y + (rect.height - label_h) / 2) -+ dc.DrawText(label, x_cursor, rect.y + (rect.height - label_h) // 2) - x_cursor += label_w + 3 - - if kind != RIBBON_BUTTON_NORMAL: -- self.DrawDropdownArrow(dc, x_cursor, rect.y + rect.height / 2, -+ self.DrawDropdownArrow(dc, x_cursor, rect.y + rect.height // 2, - self._button_bar_label_colour) - - else: -@@ -2184,7 +2184,7 @@ class RibbonMSWArtProvider(object): - - # Background - bg_rect_top = wx.Rect(*bg_rect) -- bg_rect_top.height = (bg_rect_top.height * 2) / 5 -+ bg_rect_top.height = (bg_rect_top.height * 2) // 5 - bg_rect_btm = wx.Rect(*bg_rect) - bg_rect_btm.y += bg_rect_top.height - bg_rect_btm.height -= bg_rect_top.height -@@ -2244,10 +2244,10 @@ class RibbonMSWArtProvider(object): - dc.DrawLine(rect.x + avail_width + 1, rect.y, rect.x + avail_width + 1, rect.y + rect.height) - - dc.DrawBitmap(self._toolbar_drop_bitmap, bg_rect.x + avail_width + 2, -- bg_rect.y + (bg_rect.height / 2) - 2, True) -+ bg_rect.y + (bg_rect.height // 2) - 2, True) - -- dc.DrawBitmap(bitmap, bg_rect.x + (avail_width - bitmap.GetWidth()) / 2, -- bg_rect.y + (bg_rect.height - bitmap.GetHeight()) / 2, True) -+ dc.DrawBitmap(bitmap, bg_rect.x + (avail_width - bitmap.GetWidth()) // 2, -+ bg_rect.y + (bg_rect.height - bitmap.GetHeight()) // 2, True) - - - def GetBarTabWidth(self, dc, wnd, label, bitmap, ideal=None, small_begin_need_separator=None, -@@ -2474,7 +2474,7 @@ class RibbonMSWArtProvider(object): - scroll_up.y = size.GetHeight() - 15 - scroll_up.height = 15 - scroll_up.x = 0 -- scroll_up.width = (size.GetWidth() + 2) / 3 -+ scroll_up.width = (size.GetWidth() + 2) // 3 - scroll_down.y = scroll_up.y - scroll_down.height = scroll_up.height - scroll_down.x = scroll_up.x + scroll_up.width -@@ -2491,7 +2491,7 @@ class RibbonMSWArtProvider(object): - scroll_up.x = size.GetWidth() - 15 - scroll_up.width = 15 - scroll_up.y = 0 -- scroll_up.height = (size.GetHeight() + 2) / 3 -+ scroll_up.height = (size.GetHeight() + 2) // 3 - scroll_down.x = scroll_up.x - scroll_down.width = scroll_up.width - scroll_down.y = scroll_up.y + scroll_up.height ---- a/wx/lib/agw/ribbon/bar.py -+++ b/wx/lib/agw/ribbon/bar.py -@@ -743,7 +743,7 @@ class RibbonBar(RibbonControl): - delta = info.ideal_width - info.small_must_have_separator_width - info.rect.x = x - info.rect.y = y -- info.rect.width = info.small_must_have_separator_width + delta*(width - total_small_width)/total_delta -+ info.rect.width = info.small_must_have_separator_width + delta*(width - total_small_width)//total_delta - info.rect.height = self._tab_height - - x += info.rect.width + tabsep -@@ -797,7 +797,7 @@ class RibbonBar(RibbonControl): - delta = smallest_tab_width - info.minimum_width - info.rect.x = x - info.rect.y = y -- info.rect.width = info.minimum_width + delta*(width - total_small_width)/total_delta -+ info.rect.width = info.minimum_width + delta*(width - total_small_width)//total_delta - info.rect.height = self._tab_height - - x += info.rect.width + tabsep ---- a/wx/lib/agw/ribbon/buttonbar.py -+++ b/wx/lib/agw/ribbon/buttonbar.py -@@ -354,7 +354,7 @@ class RibbonButtonBar(RibbonControl): - self._bitmap_size_large = bitmap.GetSize() - if not bitmap_small.IsOk(): - w, h = self._bitmap_size_large -- self._bitmap_size_small = wx.Size(0.5*w, 0.5*h) -+ self._bitmap_size_small = wx.Size(w//2, h//2) - - if bitmap_small.IsOk(): - -@@ -867,8 +867,8 @@ class RibbonButtonBar(RibbonControl): - - layout_size = self._layouts[layout_i].overall_size - if layout_size.x <= new_size.x and layout_size.y <= new_size.y: -- self._layout_offset.x = (new_size.x - layout_size.x)/2 -- self._layout_offset.y = (new_size.y - layout_size.y)/2 -+ self._layout_offset.x = (new_size.x - layout_size.x)//2 -+ self._layout_offset.y = (new_size.y - layout_size.y)//2 - self._current_layout = layout_i - break - ---- a/wx/lib/agw/ribbon/gallery.py -+++ b/wx/lib/agw/ribbon/gallery.py -@@ -805,8 +805,8 @@ class RibbonGallery(RibbonControl): - if client.GetWidth() < 0 or client.GetHeight() < 0: - return relative_to - -- client.x = (client.x / self._bitmap_padded_size.x) * self._bitmap_padded_size.x -- client.y = (client.y / self._bitmap_padded_size.y) * self._bitmap_padded_size.y -+ client.x = (client.x // self._bitmap_padded_size.x) * self._bitmap_padded_size.x -+ client.y = (client.y // self._bitmap_padded_size.y) * self._bitmap_padded_size.y - - size = self._art.GetGallerySize(dc, self, wx.Size(*client)) - minimum = self.GetMinSize() -@@ -849,8 +849,8 @@ class RibbonGallery(RibbonControl): - elif direction == wx.BOTH: - client.IncBy(self._bitmap_padded_size) - -- client.x = (client.x / self._bitmap_padded_size.x) * self._bitmap_padded_size.x -- client.y = (client.y / self._bitmap_padded_size.y) * self._bitmap_padded_size.y -+ client.x = (client.x // self._bitmap_padded_size.x) * self._bitmap_padded_size.x -+ client.y = (client.y // self._bitmap_padded_size.y) * self._bitmap_padded_size.y - - size = self._art.GetGallerySize(dc, self, wx.Size(*client)) - minimum = self.GetMinSize() ---- a/wx/lib/agw/ribbon/panel.py -+++ b/wx/lib/agw/ribbon/panel.py -@@ -584,12 +584,12 @@ class RibbonPanel(RibbonControl): - minimum = wx.Size(*self.GetMinSize()) - - if direction & wx.HORIZONTAL: -- current.x = (current.x * 4) / 5 -+ current.x = (current.x * 4) // 5 - if current.x < minimum.x: - current.x = minimum.x - - if direction & wx.VERTICAL: -- current.y = (current.y * 4) / 5 -+ current.y = (current.y * 4) // 5 - if current.y < minimum.y: - current.y = minimum.y - -@@ -668,10 +668,10 @@ class RibbonPanel(RibbonControl): - current = wx.Size(*relative_to) - - if direction & wx.HORIZONTAL: -- current.x = (current.x * 5 + 3) / 4 -+ current.x = (current.x * 5 + 3) // 4 - - if direction & wx.VERTICAL: -- current.y = (current.y * 5 + 3) / 4 -+ current.y = (current.y * 5 + 3) // 4 - - return current - -@@ -1076,25 +1076,25 @@ class RibbonPanel(RibbonControl): - pos = wx.Point() - - if direction == wx.NORTH: -- pos.x = panel.GetX() + (panel.GetWidth() - expanded_size.GetWidth()) / 2 -+ pos.x = panel.GetX() + (panel.GetWidth() - expanded_size.GetWidth()) // 2 - pos.y = panel.GetY() - expanded_size.GetHeight() - primary_x = True - secondary_y = 1 - - elif direction == wx.EAST: - pos.x = panel.GetRight() -- pos.y = panel.GetY() + (panel.GetHeight() - expanded_size.GetHeight()) / 2 -+ pos.y = panel.GetY() + (panel.GetHeight() - expanded_size.GetHeight()) // 2 - secondary_x = -1 - - elif direction == wx.SOUTH: -- pos.x = panel.GetX() + (panel.GetWidth() - expanded_size.GetWidth()) / 2 -+ pos.x = panel.GetX() + (panel.GetWidth() - expanded_size.GetWidth()) // 2 - pos.y = panel.GetBottom() - primary_x = True - secondary_y = -1 - - else: - pos.x = panel.GetX() - expanded_size.GetWidth() -- pos.y = panel.GetY() + (panel.GetHeight() - expanded_size.GetHeight()) / 2 -+ pos.y = panel.GetY() + (panel.GetHeight() - expanded_size.GetHeight()) // 2 - secondary_x = 1 - - expanded = wx.Rect(pos, expanded_size) ---- a/wx/lib/agw/ribbon/toolbar.py -+++ b/wx/lib/agw/ribbon/toolbar.py -@@ -1159,7 +1159,7 @@ class RibbonToolBar(RibbonControl): - - # Set group y positions - for group in self._groups: -- group.position.y = rowypos[group.position.y] -+ group.position.y = int(rowypos[group.position.y]) - - - def GetBestSizeForParentSize(self, parentSize): ---- a/wx/lib/agw/scrolledthumbnail.py -+++ b/wx/lib/agw/scrolledthumbnail.py -@@ -1162,8 +1162,8 @@ class ScrolledThumbnail(wx.ScrolledWindo - self._tWidth = width - self._tHeight = height - self._tBorder = border -- self.SetScrollRate((self._tWidth + self._tBorder)/4, -- (self._tHeight + self._tBorder)/4) -+ self.SetScrollRate((self._tWidth + self._tBorder)//4, -+ (self._tHeight + self._tBorder)//4) - self.SetSizeHints(self._tWidth + self._tBorder*2 + 16, - self._tHeight + self._tBorder*2 + 8) - if self._items: -@@ -1588,8 +1588,8 @@ class ScrolledThumbnail(wx.ScrolledWindo - - ww = img.GetWidth() - hh = img.GetHeight() -- imgRect = wx.Rect(x + (self._tWidth - img.GetWidth())/2, -- y + (self._tHeight - img.GetHeight())/2, -+ imgRect = wx.Rect(int(x + (self._tWidth - img.GetWidth())/2), -+ int(y + (self._tHeight - img.GetHeight())/2), - img.GetWidth(), img.GetHeight()) - - if not thumb._alpha and self._dropShadow: -@@ -1626,14 +1626,14 @@ class ScrolledThumbnail(wx.ScrolledWindo - else: - ty = y + hh + (self._tHeight-hh)/2 + (self._tTextHeight - sh)/2 + 3 - -- dc.DrawText(mycaption, tx, ty) -+ dc.DrawText(mycaption, int(tx), int(ty)) - - # outline - if self._tOutline != THUMB_OUTLINE_NONE and (self._tOutlineNotSelected or self.IsSelected(index)): - - dotrect = wx.Rect() -- dotrect.x = x - 2 -- dotrect.y = y - 2 -+ dotrect.x = int(x) - 2 -+ dotrect.y = int(y) - 2 - dotrect.width = bmp.GetWidth() - self._tBorder + 4 - dotrect.height = bmp.GetHeight() - self._tBorder + 4 - -@@ -1643,8 +1643,8 @@ class ScrolledThumbnail(wx.ScrolledWindo - - if self._tOutline == THUMB_OUTLINE_FULL or self._tOutline == THUMB_OUTLINE_RECT: - -- imgRect.x = x -- imgRect.y = y -+ imgRect.x = int(x) -+ imgRect.y = int(y) - imgRect.width = bmp.GetWidth() - self._tBorder - imgRect.height = bmp.GetHeight() - self._tBorder - -@@ -1708,10 +1708,10 @@ class ScrolledThumbnail(wx.ScrolledWindo - if col == 0: - row = row + 1 - -- xwhite = ((w - self._cols*(self._tWidth + self._tBorder)))/(self._cols+1) -+ xwhite = ((w - self._cols*(self._tWidth + self._tBorder)))//(self._cols+1) - tx = xwhite + col*(self._tWidth + self._tBorder) - -- ty = self._tBorder/2 + row*(self._tHeight + self._tBorder) + \ -+ ty = self._tBorder//2 + row*(self._tHeight + self._tBorder) + \ - self.GetCaptionHeight(0, row) - tw = self._tWidth + self._tBorder - th = self._tHeight + self.GetCaptionHeight(row) + self._tBorder -@@ -1723,7 +1723,7 @@ class ScrolledThumbnail(wx.ScrolledWindo - self.DrawThumbnail(thmb, self._items[ii], ii) - dc.DrawBitmap(thmb, tx, ty) - -- rect = wx.Rect(xwhite, self._tBorder/2, -+ rect = wx.Rect(xwhite, self._tBorder//2, - self._cols*(self._tWidth + self._tBorder), - self._rows*(self._tHeight + self._tBorder) + \ - self.GetCaptionHeight(0, self._rows)) ---- a/wx/lib/agw/shapedbutton.py -+++ b/wx/lib/agw/shapedbutton.py -@@ -569,9 +569,9 @@ class SButton(wx.Window): - rect2 = w*main//secondary - - if self._isup: -- img = self._mainbuttonup.Scale(rect2, rect3) -+ img = self._mainbuttonup.Scale(int(rect2), int(rect3)) - else: -- img = self._mainbuttondown.Scale(rect2, rect3) -+ img = self._mainbuttondown.Scale(int(rect2), int(rect3)) - - bmp = img.ConvertToBitmap() - -@@ -599,7 +599,7 @@ class SButton(wx.Window): - ypos = 0 - - # Draw Finally The Bitmap -- dc.DrawBitmap(bmp, xpos, ypos, True) -+ dc.DrawBitmap(bmp, int(xpos), int(ypos), True) - - # Store Bitmap Position And Size To Draw An Elliptical Focus Indicator - self._xpos = xpos -@@ -646,7 +646,7 @@ class SButton(wx.Window): - xp = xc - (tw//2)* cos(angle) - (th//2)*sin(angle) - yp = yc + (tw//2)*sin(angle) - (th//2)*cos(angle) - -- dc.DrawRotatedText(label, xp + dw, yp + dh , angle*180/pi) -+ dc.DrawRotatedText(label, int(xp + dw), int(yp + dh), angle*180/pi) - - - def DrawFocusIndicator(self, dc, width, height): -@@ -676,7 +676,7 @@ class SButton(wx.Window): - else: - # This Is An Ellipse - if hasattr(self, "_xpos"): -- dc.DrawEllipse(self._xpos + 2, self._ypos + 2, self._imgx - 4, self._imgy - 4) -+ dc.DrawEllipse(int(self._xpos + 2), int(self._ypos + 2), self._imgx - 4, self._imgy - 4) - - dc.SetLogicalFunction(wx.COPY) - ---- a/wx/lib/agw/speedmeter.py -+++ b/wx/lib/agw/speedmeter.py -@@ -580,8 +580,8 @@ class SpeedMeter(BufferedWindow): - dc.SetBackground(wx.Brush(speedbackground)) - dc.Clear() - -- centerX = self.faceBitmap.GetWidth()/2 -- centerY = self.faceBitmap.GetHeight()/2 -+ centerX = self.faceBitmap.GetWidth()//2 -+ centerY = self.faceBitmap.GetHeight()//2 - - self.CenterX = centerX - self.CenterY = centerY -@@ -681,7 +681,7 @@ class SpeedMeter(BufferedWindow): - # Draw The Filler (Both In "Advance" And "Reverse" Directions) - - dc.SetBrush(wx.Brush(fillercolour)) -- dc.DrawArc(xs2, ys2, xe2, ye2, centerX, centerY) -+ dc.DrawArc(xs2, ys2, xe2, ye2, int(centerX), int(centerY)) - - if self._agwStyle & SM_DRAW_SECTORS == 0: - dc.SetBrush(wx.Brush(speedbackground)) -@@ -952,7 +952,7 @@ class SpeedMeter(BufferedWindow): - y = y - height/2.0 - height*sin(angis)/2.0 - fancytext.RenderToDC(fancystr, dc, x, y) - else: -- dc.DrawText(strings, x, y) -+ dc.DrawText(strings, int(x), int(y)) - - # This Is The Small Rectangle --> Tick Mark - rectangle = colourangles[ii] + pi/2.0 -@@ -969,6 +969,7 @@ class SpeedMeter(BufferedWindow): - y4 = y3 + 3*self.scale*sinrect - - points = [(x1, y1), (x2, y2), (x4, y4), (x3, y3)] -+ points = [(int(p[0]), int(p[1])) for p in points] - - dc.DrawPolygon(points) - -@@ -1003,6 +1004,7 @@ class SpeedMeter(BufferedWindow): - y4 = y3 + self.scale*sinrect - - points = [(x1, y1), (x2, y2), (x4, y4), (x3, y3)] -+ points = [(int(p[0]), int(p[1])) for p in points] - - dc.DrawPolygon(points) - -@@ -1017,7 +1019,7 @@ class SpeedMeter(BufferedWindow): - dc.SetBrush(wx.TRANSPARENT_BRUSH) - - if self._drawarc: -- dc.SetPen(wx.Pen(self.GetArcColour(), 2.0)) -+ dc.SetPen(wx.Pen(self.GetArcColour(), 2)) - # If It's Not A Complete Circle, Draw The Connecting Lines And The Arc - if abs(abs(startangle - endangle) - 2*pi) > 1.0/180.0: - dc.DrawArc(xstart, ystart, xend, yend, centerX, centerY) -@@ -1046,7 +1048,7 @@ class SpeedMeter(BufferedWindow): - newx = centerX + 1.5*mw*cos(middleangle) - mw/2.0 - newy = centerY - 1.5*mh*sin(middleangle) - mh/2.0 - dc.SetTextForeground(middlecolour) -- dc.DrawText(middletext, newx, newy) -+ dc.DrawText(middletext, int(newx), int(newy)) - - # Here We Draw The Icon In The Middle, Near The Start Of The Arrow (If Present) - # This Is Like The "Fuel" Icon In The Cars -@@ -1054,8 +1056,8 @@ class SpeedMeter(BufferedWindow): - - middleicon = self.GetMiddleIcon() - middlewidth, middleheight = self.GetMiddleIconDimens() -- middleicon.SetWidth(middlewidth*self.scale) -- middleicon.SetHeight(middleheight*self.scale) -+ middleicon.SetWidth(int(middlewidth*self.scale)) -+ middleicon.SetHeight(int(middleheight*self.scale)) - middleangle = (startangle + endangle)/2.0 - - mw = middleicon.GetWidth() -@@ -1064,7 +1066,7 @@ class SpeedMeter(BufferedWindow): - newx = centerX + 1.5*mw*cos(middleangle) - mw/2.0 - newy = centerY - 1.5*mh*sin(middleangle) - mh/2.0 - -- dc.DrawIcon(middleicon, newx, newy) -+ dc.DrawIcon(middleicon, int(newx), int(newy)) - - # Restore Icon Dimension, If Not Something Strange Happens - middleicon.SetWidth(middlewidth) -@@ -1109,53 +1111,61 @@ class SpeedMeter(BufferedWindow): - if handstyle == "Arrow": - # Draw The Shadow - shadowcolour = self.GetShadowColour() -- dc.SetPen(wx.Pen(shadowcolour, 5*log(self.scale+1))) -+ dc.SetPen(wx.Pen(shadowcolour, int(5*log(self.scale+1)))) - dc.SetBrush(wx.Brush(shadowcolour)) - shadowdistance = 2.0*self.scale -- dc.DrawLine(newx + shadowdistance, newy + shadowdistance, -- xarr + shadowdistance, yarr + shadowdistance) -+ dc.DrawLine(int(newx + shadowdistance), int(newy + shadowdistance), -+ int(xarr + shadowdistance), int(yarr + shadowdistance)) - -- dc.DrawPolygon([(x1+shadowdistance, y1+shadowdistance), -- (x2+shadowdistance, y2+shadowdistance), -- (x3+shadowdistance, y3+shadowdistance)]) -+ points = [(x1+shadowdistance, y1+shadowdistance), -+ (x2+shadowdistance, y2+shadowdistance), -+ (x3+shadowdistance, y3+shadowdistance)] -+ points = [(int(p[0]), int(p[1])) for p in points] -+ dc.DrawPolygon(points) - else: - # Draw The Shadow - shadowcolour = self.GetShadowColour() - dc.SetBrush(wx.Brush(shadowcolour)) -- dc.SetPen(wx.Pen(shadowcolour, 1.0)) -+ dc.SetPen(wx.Pen(shadowcolour, 1)) - shadowdistance = 1.5*self.scale - -- dc.DrawPolygon([(x1+shadowdistance, y1+shadowdistance), -- (x2+shadowdistance, y2+shadowdistance), -- (x3+shadowdistance, y3+shadowdistance), -- (x4+shadowdistance, y4+shadowdistance)]) -+ points = [(x1+shadowdistance, y1+shadowdistance), -+ (x2+shadowdistance, y2+shadowdistance), -+ (x3+shadowdistance, y3+shadowdistance), -+ (x4+shadowdistance, y4+shadowdistance)] -+ points = [(int(p[0]), int(p[1])) for p in points] -+ dc.DrawPolygon(points) - - if handstyle == "Arrow": - -- dc.SetPen(wx.Pen(handcolour, 1.5)) -+ dc.SetPen(wx.Pen(handcolour, 1)) - - # Draw The Small Circle In The Center --> The Hand "Holder" - dc.SetBrush(wx.Brush(speedbackground)) -- dc.DrawCircle(centerX, centerY, 4*self.scale) -+ dc.DrawCircle(centerX, centerY, int(4*self.scale)) - -- dc.SetPen(wx.Pen(handcolour, 5*log(self.scale+1))) -+ dc.SetPen(wx.Pen(handcolour, int(5*log(self.scale+1)))) - # Draw The "Hand", An Arrow -- dc.DrawLine(newx, newy, xarr, yarr) -+ dc.DrawLine(int(newx), int(newy), int(xarr), int(yarr)) - - # Draw The Arrow Pointer - dc.SetBrush(wx.Brush(handcolour)) -- dc.DrawPolygon([(x1, y1), (x2, y2), (x3, y3)]) -+ points = [(x1, y1), (x2, y2), (x3, y3)] -+ points = [(int(p[0]), int(p[1])) for p in points] -+ dc.DrawPolygon(points) - - else: - - # Draw The Hand Pointer -- dc.SetPen(wx.Pen(handcolour, 1.5)) -+ dc.SetPen(wx.Pen(handcolour, 1)) - dc.SetBrush(wx.Brush(handcolour)) -- dc.DrawPolygon([(x1, y1), (x2, y2), (x3, y3), (x4, y4)]) -+ points = [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] -+ points = [(int(p[0]), int(p[1])) for p in points] -+ dc.DrawPolygon(points) - - # Draw The Small Circle In The Center --> The Hand "Holder" - dc.SetBrush(wx.Brush(speedbackground)) -- dc.DrawCircle(centerX, centerY, 4*self.scale) -+ dc.DrawCircle(centerX, centerY, int(4*self.scale)) - - - def SetIntervals(self, intervals=None): -@@ -1527,7 +1537,7 @@ class SpeedMeter(BufferedWindow): - - if font is None: - self._middletextfont = wx.Font(1, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False) -- self._middletextsize = 10.0 -+ self._middletextsize = 10 - self._middletextfont.SetPointSize(self._middletextsize) - else: - self._middletextfont = font -@@ -1599,7 +1609,7 @@ class SpeedMeter(BufferedWindow): - x = radius*cos(angle) + centerX - y = radius*sin(angle) + centerY - -- return x, y -+ return int(x), int(y) - - - def GetIntersection(self, current, intervals): ---- a/wx/lib/agw/supertooltip.py -+++ b/wx/lib/agw/supertooltip.py -@@ -295,8 +295,8 @@ class ToolTipWindowBase(object): - - # Get the user options for header, bitmaps etc... - drawHeader, drawFooter = classParent.GetDrawHeaderLine(), classParent.GetDrawFooterLine() -- topRect = wx.Rect(frameRect.x, frameRect.y, frameRect.width, frameRect.height/2) -- bottomRect = wx.Rect(frameRect.x, frameRect.y+frameRect.height/2, frameRect.width, frameRect.height/2+1) -+ topRect = wx.Rect(frameRect.x, frameRect.y, frameRect.width, frameRect.height//2) -+ bottomRect = wx.Rect(frameRect.x, frameRect.y+frameRect.height//2, frameRect.width, frameRect.height//2+1) - # Fill the triple-gradient - dc.GradientFillLinear(topRect, topColour, middleColour, wx.SOUTH) - dc.GradientFillLinear(bottomRect, middleColour, bottomColour, wx.SOUTH) -@@ -324,9 +324,9 @@ class ToolTipWindowBase(object): - normalText = classParent.GetTextColour() - if header: - dc.SetTextForeground(normalText) -- dc.DrawText(header, bmpXPos+bmpWidth+self._spacing, (height-textHeight+self._spacing)/2) -+ dc.DrawText(header, bmpXPos+bmpWidth+self._spacing, (height-textHeight+self._spacing)//2) - if headerBmp and headerBmp.IsOk(): -- dc.DrawBitmap(headerBmp, bmpXPos, (height-bmpHeight+self._spacing)/2, True) -+ dc.DrawBitmap(headerBmp, bmpXPos, (height-bmpHeight+self._spacing)//2, True) - - if header or (headerBmp and headerBmp.IsOk()): - yPos += height -@@ -376,7 +376,7 @@ class ToolTipWindowBase(object): - messageHeight += textHeight - - xText = (bmpWidth + 2 * self._spacing) if bmpWidth > 0 else self._spacing -- yText += textHeight/2+self._spacing -+ yText += textHeight//2+self._spacing - maxWidth = max(xText + textWidth + self._spacing, maxWidth) - dc.DrawText(line, xText, yText) - if isLink: -@@ -412,8 +412,8 @@ class ToolTipWindowBase(object): - if drawFooter: - # Draw the separator line before the footer - dc.SetPen(wx.GREY_PEN) -- dc.DrawLine(self._spacing, yPos-self._spacing/2+toAdd, -- width-self._spacing, yPos-self._spacing/2+toAdd) -+ dc.DrawLine(self._spacing, yPos-self._spacing//2+toAdd, -+ width-self._spacing, yPos-self._spacing//2+toAdd) - # Draw the footer and footer bitmap (if any) - dc.SetTextForeground(normalText) - height = max(textHeight, bmpHeight) -@@ -424,7 +424,7 @@ class ToolTipWindowBase(object): - maxWidth = max(bmpXPos + bmpWidth + (self._spacing*2) + textWidth, maxWidth) - if footerBmp and footerBmp.IsOk(): - toAdd = (height - bmpHeight + self._spacing) / 2 -- dc.DrawBitmap(footerBmp, bmpXPos, yPos + toAdd, True) -+ dc.DrawBitmap(footerBmp, bmpXPos, int(yPos + toAdd), True) - maxWidth = max(footerBmp.GetSize().GetWidth() + bmpXPos, maxWidth) - - maxHeight = yPos + height + toAdd -@@ -815,7 +815,7 @@ class SuperToolTip(object): - :param `delay`: the delay in seconds. - """ - -- self._startDelayTime = float(delay) -+ self._startDelayTime = int(delay) - - - def GetStartDelay(self): -@@ -831,7 +831,7 @@ class SuperToolTip(object): - :param `delay`: the delay in seconds. - """ - -- self._endDelayTime = float(delay) -+ self._endDelayTime = int(delay) - - - def GetEndDelay(self): ---- a/wx/lib/agw/toasterbox.py -+++ b/wx/lib/agw/toasterbox.py -@@ -1316,11 +1316,11 @@ class ToasterBoxWindow(wx.Frame): - for line in lines: - w, h = dc.GetTextExtent(line) - fh += h + textPadding -- y = (th - fh) / 2; coords = [] -+ y = (th - fh) // 2; coords = [] - - for line in lines: - w, h = dc.GetTextExtent(line) -- x = (tw - w) / 2 -+ x = (tw - w) // 2 - coords.append((x, y)) - y += h + textPadding - ---- a/wx/lib/agw/ultimatelistctrl.py -+++ b/wx/lib/agw/ultimatelistctrl.py -@@ -914,7 +914,7 @@ class PyImageList(object): - raise Exception("Wrong index in image list") - - bmp = self._images[index] -- dc.DrawBitmap(bmp, x, y, (flags & wx.IMAGELIST_DRAW_TRANSPARENT) > 0) -+ dc.DrawBitmap(bmp, x, int(y), (flags & wx.IMAGELIST_DRAW_TRANSPARENT) > 0) - - return True - -@@ -4022,7 +4022,7 @@ class UltimateListLineData(object): - - if item.HasImage(): - -- self._gi._rectIcon.x = self._gi._rectAll.x + 4 + (self._gi._rectAll.width - self._gi._rectIcon.width)/2 -+ self._gi._rectIcon.x = self._gi._rectAll.x + 4 + (self._gi._rectAll.width - self._gi._rectIcon.width)//2 - self._gi._rectIcon.y = self._gi._rectAll.y + 4 - - if item.HasText(): -@@ -4030,7 +4030,7 @@ class UltimateListLineData(object): - if self._gi._rectLabel.width > spacing: - self._gi._rectLabel.x = self._gi._rectAll.x + 2 - else: -- self._gi._rectLabel.x = self._gi._rectAll.x + 2 + (spacing/2) - (self._gi._rectLabel.width/2) -+ self._gi._rectLabel.x = self._gi._rectAll.x + 2 + (spacing//2) - (self._gi._rectLabel.width//2) - - self._gi._rectLabel.y = self._gi._rectAll.y + self._gi._rectAll.height + 2 - self._gi._rectLabel.height - self._gi._rectHighlight.x = self._gi._rectLabel.x - 2 -@@ -4546,7 +4546,7 @@ class UltimateListLineData(object): - # We got a checkbox-type item - ix, iy = self._owner.GetCheckboxImageSize() - checked = item.IsChecked() -- self._owner.DrawCheckbox(dc, xOld, y + (height-iy+1)/2, item.GetKind(), checked, enabled) -+ self._owner.DrawCheckbox(dc, xOld, y + (height-iy+1)//2, item.GetKind(), checked, enabled) - xOld += ix - width -= ix - -@@ -4557,7 +4557,7 @@ class UltimateListLineData(object): - for img in images: - - ix, iy = self._owner.GetImageSize([img]) -- self._owner.DrawImage(img, dc, xOld, y + (height-iy)/2, enabled) -+ self._owner.DrawImage(img, dc, xOld, y + (height-iy)//2, enabled) - - xOld += ix - width -= ix -@@ -5230,7 +5230,7 @@ class UltimateListHeaderWindow(wx.Contro - # We got a checkbox-type item - ix, iy = self._owner.GetCheckboxImageSize() - # We draw it on the left, always -- self._owner.DrawCheckbox(dc, x + HEADER_OFFSET_X, HEADER_OFFSET_Y + (h - 4 - iy)/2, kind, checked, enabled) -+ self._owner.DrawCheckbox(dc, x + HEADER_OFFSET_X, HEADER_OFFSET_Y + (h - 4 - iy)//2, kind, checked, enabled) - wcheck += ix + HEADER_IMAGE_MARGIN_IN_REPORT_MODE - cw -= ix + HEADER_IMAGE_MARGIN_IN_REPORT_MODE - -@@ -6819,7 +6819,7 @@ class UltimateListMainWindow(wx.Scrolled - # We got a checkbox-type item - ix, iy = self.GetCheckboxImageSize() - LH = self.GetLineHeight(line) -- rect = wx.Rect(xOld, lineY + LH/2 - iy/2, ix, iy) -+ rect = wx.Rect(xOld, lineY + LH//2 - iy//2, ix, iy) - if rect.Contains((x, y)): - newItem = self.GetParent().GetItem(line, col) - return newItem, ULC_HITTEST_ONITEMCHECK -@@ -7937,13 +7937,13 @@ class UltimateListMainWindow(wx.Scrolled - while start_y > view_y: - start_y -= SCROLL_UNIT_Y - -- self.Scroll(-1, start_y/SCROLL_UNIT_Y) -+ self.Scroll(-1, start_y//SCROLL_UNIT_Y) - - if start_y + height > view_y + client_h: - while start_y + height < view_y + client_h: - start_y += SCROLL_UNIT_Y - -- self.Scroll(-1, (start_y+height-client_h+SCROLL_UNIT_Y)/SCROLL_UNIT_Y) -+ self.Scroll(-1, (start_y+height-client_h+SCROLL_UNIT_Y)//SCROLL_UNIT_Y) - - else: # !report - -@@ -7960,7 +7960,7 @@ class UltimateListMainWindow(wx.Scrolled - if rect.y + rect.height - 5 > view_y + client_h: - sy = (rect.y + rect.height - client_h + hLine)/hLine - -- self.Scroll(sx, sy) -+ self.Scroll(int(sx), int(sy)) - - - # ---------------------------------------------------------------------------- ---- a/wx/lib/agw/xlsgrid.py -+++ b/wx/lib/agw/xlsgrid.py -@@ -965,7 +965,7 @@ class XLSText(object): - xp = xc - (text_width/2)*xshift - (text_height/2)*yshift - yp = yc + (text_width/2)*yshift - (text_height/2)*xshift - -- dc.DrawRotatedText(value, xp, yp, self.rotation) -+ dc.DrawRotatedText(value, int(xp), int(yp), self.rotation) - - else: - -@@ -1125,7 +1125,7 @@ class XLSRichText(XLSText): - if font.escapement == 1: - ypos = ypos - maxH + height - -- dc.DrawText(chunk, start, ypos) -+ dc.DrawText(chunk, start, int(ypos)) - start += width - - ---- a/wx/lib/agw/zoombar.py -+++ b/wx/lib/agw/zoombar.py -@@ -463,7 +463,7 @@ class ZoomBarImage(object): - def GetPosition(self): - """ Returns the button position. """ - -- return wx.Point(self._left, self._top) -+ return wx.Point(int(self._left), int(self._top)) - - - def GetSize(self): -@@ -601,7 +601,7 @@ class ImageBar(object): - def GetPosition(self): - """ Returns the position of :class:`wx.ImageBar`, as a :class:`wx.Point`. """ - -- return wx.Point(self._left, self._top) -+ return wx.Point(int(self._left), int(self._top)) - - - def GetSize(self): -@@ -660,7 +660,7 @@ class ImageBar(object): - if xSize is not None: - self._size = wx.Size(xSize, ySize) - -- bitmap.Rescale(self._size.width, self._size.height/2) -+ bitmap.Rescale(self._size.width, self._size.height//2) - - r1, g1, b1 = self._startColour.Red(), self._startColour.Green(), self._startColour.Blue() - r2, g2, b2 = colour.Red(), colour.Green(), colour.Blue() -@@ -1065,7 +1065,7 @@ class ZoomBar(wx.Control): - ySize += yextent - - if self._showReflections: -- ySize += self._buttonSize/2 -+ ySize += self._buttonSize//2 - if self._centerZoom: - ySize += self._buttonSize - -@@ -1240,7 +1240,7 @@ class ZoomBar(wx.Control): - textWidth, textHeight = dc.GetTextExtent(label) - buttonPos = button.GetPosition() - buttonSize = button.GetSize() -- xpos = buttonPos.x + (buttonSize.width - textWidth)/2 -+ xpos = buttonPos.x + (buttonSize.width - textWidth)//2 - ypos = buttonPos.y - textHeight - 2 - - dc.DrawRectangle(xpos-2, ypos-1, textWidth+4, textHeight+2) ---- a/wx/lib/analogclock/analogclock.py -+++ b/wx/lib/analogclock/analogclock.py -@@ -173,7 +173,7 @@ class AnalogClock(wx.Window): - scale = min([float(size.width) / self.basesize.width, - float(size.height) / self.basesize.height]) - -- centre = wx.Point(size.width / 2., size.height / 2.) -+ centre = wx.Point(size.width // 2, size.height // 2) - - self.Box.RecalcCoords(size, centre, scale) - self.Hands.RecalcCoords(size, centre, scale) ---- a/wx/lib/analogclock/helpers.py -+++ b/wx/lib/analogclock/helpers.py -@@ -37,7 +37,7 @@ class Element: - - - def _pol2rect(self, m, t): -- return m * math.cos(math.radians(t)), m * math.sin(math.radians(t)) -+ return int(m * math.cos(math.radians(t))), int(m * math.sin(math.radians(t))) - - - def _rect2pol(self, x, y): -@@ -174,7 +174,7 @@ class Face(ElementWithDyer): - - def Draw(self, dc): - self.dyer.Select(dc) -- dc.DrawCircle(self.pos.x, self.pos.y, self.radius) -+ dc.DrawCircle(self.pos.x, self.pos.y, int(self.radius)) - - - def RecalcCoords(self, clocksize, centre, scale): -@@ -205,7 +205,7 @@ class Hand(ElementWithDyer): - m, t = self._rect2pol(x, y) - polygon[i] = self._pol2rect(m, t - angle) - -- dc.DrawPolygon(polygon, centre.x + offset, centre.y + offset) -+ dc.DrawPolygon(polygon, int(centre.x + offset), int(centre.y + offset)) - - - def RecalcCoords(self, clocksize, centre, scale): -@@ -226,7 +226,7 @@ class TickSquare(Element): - x = self.pos.x - width / 2. - y = self.pos.y - height / 2. - -- dc.DrawRectangle(x + offset, y + offset, width, height) -+ dc.DrawRectangle(int(x + offset), int(y + offset), int(width), int(height)) - - #---------------------------------------------------------------------- - -@@ -242,7 +242,7 @@ class TickCircle(Element): - x = self.pos.x - y = self.pos.y - -- dc.DrawCircle(x + offset, y + offset, radius) -+ dc.DrawCircle(int(x + offset), int(y + offset), int(radius)) - - #---------------------------------------------------------------------- - -@@ -273,7 +273,7 @@ class TickPoly(Element): - x = self.pos.x - width / 2. - y = self.pos.y - height / 2. - -- dc.DrawPolygon(polygon, x + offset, y + offset) -+ dc.DrawPolygon(polygon, int(x + offset), int(y + offset)) - - - def DrawRotated(self, dc, offset=0): -@@ -290,7 +290,7 @@ class TickPoly(Element): - x = self.pos.x - math.cos(r) * width / 2. - math.sin(r) * height / 2. - y = self.pos.y - math.cos(r) * height / 2. + math.sin(r) * width / 2. - -- dc.DrawPolygon(polygon, x + offset, y + offset) -+ dc.DrawPolygon(polygon, int(x + offset), int(y + offset)) - - #---------------------------------------------------------------------- - -@@ -309,7 +309,7 @@ class TickDecimal(Element): - x = self.pos.x - width / 2. - y = self.pos.y - height / 2. - -- dc.DrawText(self.text, x + offset, y + offset) -+ dc.DrawText(self.text, int(x + offset), int(y + offset)) - - - def DrawRotated(self, dc, offset=0): -@@ -321,7 +321,7 @@ class TickDecimal(Element): - x = self.pos.x - math.cos(r) * width / 2. - math.sin(r) * height / 2. - y = self.pos.y - math.cos(r) * height / 2. + math.sin(r) * width / 2. - -- dc.DrawRotatedText(self.text, x + offset, y + offset, angle) -+ dc.DrawRotatedText(self.text, int(x + offset), int(y + offset), int(angle)) - - - #---------------------------------------------------------------------- -@@ -656,7 +656,7 @@ class TickSet: - - # Try to find a 'good' max size for text-based ticks. - if a_tick.text is not None: -- self.font.SetPointSize(size) -+ self.font.SetPointSize(int(size)) - dc = wx.MemoryDC() - dc.SelectObject(wx.Bitmap(*clocksize.Get())) - dc.SetFont(self.font) -@@ -686,7 +686,7 @@ class TickSet: - x = centre.x + radius * math.sin(angle) - y = centre.y + radius * math.cos(angle) - -- tick.SetPosition(wx.Point(x, y)) -+ tick.SetPosition(wx.Point(int(x), int(y))) - - - def GetSize(self): ---- a/wx/lib/analogclock/setup.py -+++ b/wx/lib/analogclock/setup.py -@@ -179,7 +179,7 @@ class _Group_1(_GroupBase): - p.SetCustomColours(self.customcolours) - sizer.Add(p, pos=(0, 1), flag=wx.ALIGN_CENTRE_VERTICAL) - -- p = self.bw = wx.SpinCtrl(self, size=(75, 21), -+ p = self.bw = wx.SpinCtrl(self, - min=0, max=100, value="75") - sizer.Add(p, pos=(0, 2), span=(1, 2), flag=wx.ALIGN_CENTRE_VERTICAL) - -@@ -193,7 +193,7 @@ class _Group_1(_GroupBase): - p = self.ls = wx.StaticText(self, label="Size:") - sizer.Add(p, pos=(2, 0), flag=wx.ALIGN_CENTRE_VERTICAL) - -- p = self.sz = wx.SpinCtrl(self, size=(75, 21), -+ p = self.sz = wx.SpinCtrl(self, - min=0, max=100, value="75") - sizer.Add(p, pos=(2, 1), span=(1, 3), flag=wx.ALIGN_CENTRE_VERTICAL) - -@@ -212,7 +212,7 @@ class _Group_2(_Group_1): - p = wx.StaticText(self, label="Offset:") - sizer.Add(p, pos=(3, 0), flag=wx.ALIGN_CENTRE_VERTICAL) - -- p = self.of = wx.SpinCtrl(self, size=(75, 21), -+ p = self.of = wx.SpinCtrl(self, - min=0, max=100, value="75") - sizer.Add(p, pos=(3, 1), span=(1, 3), flag=wx.ALIGN_CENTRE_VERTICAL) - ---- a/wx/lib/buttons.py -+++ b/wx/lib/buttons.py -@@ -453,7 +453,7 @@ class GenButton(wx.Control): - tw, th = dc.GetTextExtent(label) - if not self.up: - dx = dy = self.labelDelta -- dc.DrawText(label, (width-tw)/2+dx, (height-th)/2+dy) -+ dc.DrawText(label, (width-tw)//2+dx, (height-th)//2+dy) - - - def DrawFocusIndicator(self, dc, w, h): -@@ -844,7 +844,7 @@ class GenBitmapButton(GenButton): - if not self.up: - dx = dy = self.labelDelta - hasMask = bmp.GetMask() is not None -- dc.DrawBitmap(bmp, (width-bw)/2+dx, (height-bh)/2+dy, hasMask) -+ dc.DrawBitmap(bmp, (width-bw)//2+dx, (height-bh)//2+dy, hasMask) - - - #---------------------------------------------------------------------- -@@ -926,12 +926,12 @@ class GenBitmapTextButton(GenBitmapButto - if not self.up: - dx = dy = self.labelDelta - -- pos_x = (width-bw-tw)/2+dx # adjust for bitmap and text to centre -+ pos_x = (width-bw-tw)//2+dx # adjust for bitmap and text to centre - if bmp is not None: -- dc.DrawBitmap(bmp, pos_x, (height-bh)/2+dy, hasMask) # draw bitmap if available -+ dc.DrawBitmap(bmp, pos_x, (height-bh)//2+dy, hasMask) # draw bitmap if available - pos_x = pos_x + 2 # extra spacing from bitmap - -- dc.DrawText(label, pos_x + dx+bw, (height-th)/2+dy) # draw the text -+ dc.DrawText(label, pos_x + dx+bw, (height-th)//2+dy) # draw the text - - - #---------------------------------------------------------------------- ---- a/wx/lib/colourchooser/pycolourchooser.py -+++ b/wx/lib/colourchooser/pycolourchooser.py -@@ -188,7 +188,7 @@ class PyColourChooser(wx.Panel): - self.colour_slider.Bind(wx.EVT_MOTION, self.onSliderMotion) - self.slider = wx.Slider( - self, self.idSCROLL, 86, 0, self.colour_slider.HEIGHT - 1, -- style=wx.SL_VERTICAL, size=(15, self.colour_slider.HEIGHT) -+ style=wx.SL_VERTICAL, size=(-1, self.colour_slider.HEIGHT) - ) - - self.Bind(wx.EVT_COMMAND_SCROLL, self.onScroll, self.slider) -@@ -338,7 +338,7 @@ class PyColourChooser(wx.Panel): - min = self.slider.GetMin() - max = self.slider.GetMax() - val = (1 - v) * max -- self.slider.SetValue(val) -+ self.slider.SetValue(int(val)) - - def getVFromSlider(self): - """Get the current value of "V" from the v slider.""" ---- a/wx/lib/colourchooser/pypalette.py -+++ b/wx/lib/colourchooser/pypalette.py -@@ -165,7 +165,7 @@ class PyPalette(canvas.Canvas): - if self.point: - self.buffer.SetPen(wx.BLACK_PEN) - self.buffer.SetBrush(wx.TRANSPARENT_BRUSH) -- self.buffer.DrawCircle(self.point[0], self.point[1], 3) -+ self.buffer.DrawCircle(int(self.point[0]), int(self.point[1]), 3) - - def HighlightPoint(self, x, y): - """Highlights an area of the palette with a little circle around ---- a/wx/lib/floatcanvas/FCObjects.py -+++ b/wx/lib/floatcanvas/FCObjects.py -@@ -296,7 +296,7 @@ class DrawObject: - else: - self.Pen = self.PenList.setdefault( - (LineColor, LineStyle, LineWidth), -- wx.Pen(LineColor, LineWidth, self.LineStyleList[LineStyle])) -+ wx.Pen(LineColor, int(LineWidth), self.LineStyleList[LineStyle])) - - def SetHitBrush(self, HitColor): - """ -@@ -1202,14 +1202,14 @@ class SquarePoint(XYObjectMixin, ColorOn - x = xc - Size/2.0 - y = yc - Size/2.0 - dc.SetBrush(self.Brush) -- dc.DrawRectangle(x, y, Size, Size) -+ dc.DrawRectangle(int(x), int(y), Size, Size) - if HTdc and self.HitAble: - HTdc.SetPen(self.HitPen) - if self.Size <= 1: - HTdc.DrawPoint(xc, xc) - else: - HTdc.SetBrush(self.HitBrush) -- HTdc.DrawRectangle(x, y, Size, Size) -+ HTdc.DrawRectangle(int(x), int(y), Size, Size) - - class RectEllipse(XYObjectMixin, LineAndFillMixin, DrawObject): - """A RectEllipse draw object.""" -@@ -2161,7 +2161,7 @@ class ScaledBitmap(TextObjectMixin, Draw - W = H * (self.bmpWidth / self.bmpHeight) - if (self.ScaledBitmap is None) or (H != self.ScaledHeight) : - self.ScaledHeight = H -- Img = self.Image.Scale(W, H) -+ Img = self.Image.Scale(int(W), int(H)) - self.ScaledBitmap = wx.Bitmap(Img) - - XY = self.ShiftFun(XY[0], XY[1], W, H) ---- a/wx/lib/gizmos/ledctrl.py -+++ b/wx/lib/gizmos/ledctrl.py -@@ -293,7 +293,7 @@ class LEDNumberCtrl(wx.Control): - - if digit & c.COLON: - dc.SetBrush(wx.Brush(lineColor)) -- centerX = XPos + (self.m_lineLength + self.m_digitMargin) / 2 -- radius = self.m_lineWidth / 2 -- dc.DrawCircle(centerX, (self.m_lineLength + (self.m_lineMargin * 4)) / 2, radius) -- dc.DrawCircle(centerX, (self.m_lineLength * 2 + (self.m_lineMargin * 6)) * 3 / 4, radius) -+ centerX = XPos + (self.m_lineLength + self.m_digitMargin) // 2 -+ radius = self.m_lineWidth // 2 -+ dc.DrawCircle(centerX, (self.m_lineLength + (self.m_lineMargin * 4)) // 2, radius) -+ dc.DrawCircle(centerX, (self.m_lineLength * 2 + (self.m_lineMargin * 6)) * 3 // 4, radius) ---- a/wx/lib/imagebrowser.py -+++ b/wx/lib/imagebrowser.py -@@ -347,8 +347,8 @@ class ImageView(wx.Window): - owidth = int(scale*iwidth) - oheight = int(scale*iheight) - -- diffx = (wwidth - owidth)/2 # center calc -- diffy = (wheight - oheight)/2 # center calc -+ diffx = (wwidth - owidth)//2 # center calc -+ diffy = (wheight - oheight)//2 # center calc - - if not bmp: - if owidth!=iwidth or oheight!=iheight: ---- a/wx/lib/ogl/basic.py -+++ b/wx/lib/ogl/basic.py -@@ -1051,7 +1051,7 @@ class Shape(ShapeEvtHandler): - dc.SetPen(self.GetBackgroundPen()) - dc.SetBrush(self.GetBackgroundBrush()) - -- dc.DrawRectangle(topLeftX - penWidth, topLeftY - penWidth, maxX + penWidth * 2 + 4, maxY + penWidth * 2 + 4) -+ dc.DrawRectangle(int(topLeftX - penWidth), int(topLeftY - penWidth), int(maxX + penWidth * 2 + 4), int(maxY + penWidth * 2 + 4)) - - def EraseLinks(self, dc, attachment = -1, recurse = False): - """ -@@ -2769,9 +2769,9 @@ class RectangleShape(Shape): - dc.SetBrush(self._brush) - - if self._cornerRadius: -- dc.DrawRoundedRectangle(x1, y1, self._width, self._height, self._cornerRadius) -+ dc.DrawRoundedRectangle(int(x1), int(y1), self._width, self._height, self._cornerRadius) - else: -- dc.DrawRectangle(x1, y1, self._width, self._height) -+ dc.DrawRectangle(int(x1), int(y1), self._width, self._height) - - def GetBoundingBoxMin(self): - """Get the bounding box minimum.""" -@@ -2882,7 +2882,7 @@ class PolygonShape(Shape): - # Duplicate the list of points - self._points = [] - for point in the_points: -- new_point = wx.Point(point[0], point[1]) -+ new_point = wx.Point(int(point[0]), int(point[1])) - self._points.append(new_point) - self.CalculateBoundingBox() - self._originalWidth = self._boundWidth -@@ -3444,7 +3444,7 @@ class EllipseShape(Shape): - dc.SetPen(self._pen) - if self._brush: - dc.SetBrush(self._brush) -- dc.DrawEllipse(self._xpos - self.GetWidth() / 2.0, self._ypos - self.GetHeight() / 2.0, self.GetWidth(), self.GetHeight()) -+ dc.DrawEllipse(int(self._xpos - self.GetWidth() / 2.0), int(self._ypos - self.GetHeight() / 2.0), self.GetWidth(), self.GetHeight()) - - def SetSize(self, x, y, recursive = True): - """ ---- a/wx/lib/ogl/bmpshape.py -+++ b/wx/lib/ogl/bmpshape.py -@@ -32,7 +32,7 @@ class BitmapShape(RectangleShape): - - x = self._xpos - self._bitmap.GetWidth() / 2.0 - y = self._ypos - self._bitmap.GetHeight() / 2.0 -- dc.DrawBitmap(self._bitmap, x, y, True) -+ dc.DrawBitmap(self._bitmap, int(x), int(y), True) - - def SetSize(self, w, h, recursive = True): - """ ---- a/wx/lib/ogl/composit.py -+++ b/wx/lib/ogl/composit.py -@@ -1131,11 +1131,11 @@ class DivisionShape(CompositeShape): - - if self._leftSide: - dc.SetPen(self._leftSidePen) -- dc.DrawLine(x1, y2, x1, y1) -+ dc.DrawLine(int(x1), int(y2), int(x1), int(y1)) - - if self._topSide: - dc.SetPen(self._topSidePen) -- dc.DrawLine(x1, y1, x2, y1) -+ dc.DrawLine(int(x1), int(y1), int(x2), int(y1)) - - # For testing purposes, draw a rectangle so we know - # how big the division is. ---- a/wx/lib/ogl/divided.py -+++ b/wx/lib/ogl/divided.py -@@ -231,7 +231,7 @@ class DividedShape(RectangleShape): - regionPen = region.GetActualPen() - if regionPen: - dc.SetPen(regionPen) -- dc.DrawLine(leftX, y, rightX, y) -+ dc.DrawLine(int(leftX), int(y), int(rightX), int(y)) - - currentY = actualY - ---- a/wx/lib/ogl/lines.py -+++ b/wx/lib/ogl/lines.py -@@ -1200,7 +1200,7 @@ class LineShape(Shape): - - points = [] - for point in self._lineControlPoints: -- points.append(wx.Point(point[0], point[1])) -+ points.append(wx.Point(int(point[0]), int(point[1]))) - - if self._isSpline: - dc.DrawSpline(points) ---- a/wx/lib/ogl/oglmisc.py -+++ b/wx/lib/ogl/oglmisc.py -@@ -300,10 +300,10 @@ def DrawFormattedText(dc, text_list, xpo - yoffset = ypos - height / 2.0 - - # +1 to allow for rounding errors -- dc.SetClippingRegion(xpos - width / 2.0, ypos - height / 2.0, width + 1, height + 1) -+ dc.SetClippingRegion(int(xpos - width / 2.0), int(ypos - height / 2.0), int(width + 1), int(height + 1)) - - for line in text_list: -- dc.DrawText(line.GetText(), xoffset + line.GetX(), yoffset + line.GetY()) -+ dc.DrawText(line.GetText(), int(xoffset + line.GetX()), int(yoffset + line.GetY())) - - dc.DestroyClippingRegion() - ---- a/wx/lib/plot/examples/demo.py -+++ b/wx/lib/plot/examples/demo.py -@@ -984,7 +984,7 @@ class PlotDemoMainFrame(wx.Frame): - - sx, sy = mDataDict["scaledXY"] # scaled x,y of closest point - # 10by10 square centered on point -- dc.DrawRectangle(sx - 5, sy - 5, 10, 10) -+ dc.DrawRectangle(int(sx - 5), int(sy - 5), 10, 10) - px, py = mDataDict["pointXY"] - cNum = mDataDict["curveNum"] - pntIn = mDataDict["pIndex"] -@@ -992,7 +992,7 @@ class PlotDemoMainFrame(wx.Frame): - # make a string to display - s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" % ( - cNum, legend, px, py, pntIn) -- dc.DrawText(s, sx, sy + 1) -+ dc.DrawText(s, int(sx), int(sy + 1)) - - - def run_demo(): ---- a/wx/lib/plot/plotcanvas.py -+++ b/wx/lib/plot/plotcanvas.py -@@ -174,24 +174,24 @@ class PlotCanvas(wx.Panel): - - # Default Pens - self._gridPen = wx.Pen(wx.Colour(180, 180, 180, 255), -- self._pointSize[0], -+ int(self._pointSize[0]), - wx.PENSTYLE_DOT) - - self._centerLinePen = wx.Pen(wx.RED, -- self._pointSize[0], -+ int(self._pointSize[0]), - wx.PENSTYLE_SHORT_DASH) - - self._axesPen = wx.Pen(wx.BLACK, -- self._pointSize[0], -+ int(self._pointSize[0]), - wx.PENSTYLE_SOLID) - - self._tickPen = wx.Pen(wx.BLACK, -- self._pointSize[0], -+ int(self._pointSize[0]), - wx.PENSTYLE_SOLID) - self._tickLength = tuple(-x * 2 for x in self._pointSize) - - self._diagonalPen = wx.Pen(wx.BLUE, -- self._pointSize[0], -+ int(self._pointSize[0]), - wx.PENSTYLE_DOT_DASH) - - def SetCursor(self, cursor): -@@ -1925,10 +1925,10 @@ class PlotCanvas(wx.Panel): - # set clipping area so drawing does not occur outside axis box - ptx, pty, rectWidth, rectHeight = self._point2ClientCoord(p1, p2) - # allow graph to overlap axis lines by adding units to w and h -- dc.SetClippingRegion(ptx * self._pointSize[0], -- pty * self._pointSize[1], -- rectWidth * self._pointSize[0] + 2, -- rectHeight * self._pointSize[1] + 1) -+ dc.SetClippingRegion(int(ptx * self._pointSize[0]), -+ int(pty * self._pointSize[1]), -+ int(rectWidth * self._pointSize[0] + 2), -+ int(rectHeight * self._pointSize[1] + 1)) - # Draw the lines and markers - # start = _time.perf_counter() - graphics.draw(dc) -@@ -2280,7 +2280,7 @@ class PlotCanvas(wx.Panel): - pnt = ((trhc[0] + legendLHS + legendSymExt[0] - + 5 * self._pointSize[0]), - trhc[1] + s + lineHeight / 2. - legendTextExt[1] / 2) -- dc.DrawText(o.getLegend(), pnt[0], pnt[1]) -+ dc.DrawText(o.getLegend(), int(pnt[0]), int(pnt[1])) - dc.SetFont(self._getFont(self._fontSizeAxis)) # reset - - def _titleLablesWH(self, dc, graphics): -@@ -2329,7 +2329,7 @@ class PlotCanvas(wx.Panel): - dc.SetPen(wx.Pen(wx.BLACK)) - dc.SetBrush(wx.Brush(wx.WHITE, wx.BRUSHSTYLE_TRANSPARENT)) - dc.SetLogicalFunction(wx.INVERT) -- dc.DrawRectangle(ptx, pty, rectWidth, rectHeight) -+ dc.DrawRectangle(int(ptx), int(pty), int(rectWidth), int(rectHeight)) - dc.SetLogicalFunction(wx.COPY) - - def _getFont(self, size): -@@ -2423,7 +2423,7 @@ class PlotCanvas(wx.Panel): - # increases thickness for printing only - pen = self.gridPen - penWidth = self.printerScale * pen.GetWidth() -- pen.SetWidth(penWidth) -+ pen.SetWidth(int(penWidth)) - dc.SetPen(pen) - - x, y, width, height = self._point2ClientCoord(p1, p2) -@@ -2432,13 +2432,13 @@ class PlotCanvas(wx.Panel): - if self.enableGrid[0]: - for x, _ in xticks: - pt = scale_and_shift_point(x, p1[1], scale, shift) -- dc.DrawLine(pt[0], pt[1], pt[0], pt[1] - height) -+ dc.DrawLine(int(pt[0]), int(pt[1]), int(pt[0]), int(pt[1] - height)) - - if self._ySpec != 'none': - if self.enableGrid[1]: - for y, label in yticks: - pt = scale_and_shift_point(p1[0], y, scale, shift) -- dc.DrawLine(pt[0], pt[1], pt[0] + width, pt[1]) -+ dc.DrawLine(int(pt[0]), int(pt[1]), int(pt[0] + width), int(pt[1])) - - @TempStyle('pen') - def _drawTicks(self, dc, p1, p2, scale, shift, xticks, yticks): -@@ -2471,7 +2471,7 @@ class PlotCanvas(wx.Panel): - # increases thickness for printing only - pen = self.tickPen - penWidth = self.printerScale * pen.GetWidth() -- pen.SetWidth(penWidth) -+ pen.SetWidth(int(penWidth)) - dc.SetPen(pen) - - # lengthen lines for printing -@@ -2484,13 +2484,13 @@ class PlotCanvas(wx.Panel): - lines = [] - for x, label in xticks: - pt = scale_and_shift_point(x, p1[1], scale, shift) -- lines.append((pt[0], pt[1], pt[0], pt[1] - xTickLength)) -+ lines.append((int(pt[0]), int(pt[1]), int(pt[0]), int(pt[1] - xTickLength))) - dc.DrawLineList(lines) - if ticks.top: - lines = [] - for x, label in xticks: - pt = scale_and_shift_point(x, p2[1], scale, shift) -- lines.append((pt[0], pt[1], pt[0], pt[1] + xTickLength)) -+ lines.append((int(pt[0]), int(pt[1]), int(pt[0]), int(pt[1] + xTickLength))) - dc.DrawLineList(lines) - - if self.ySpec != 'none': -@@ -2498,13 +2498,13 @@ class PlotCanvas(wx.Panel): - lines = [] - for y, label in yticks: - pt = scale_and_shift_point(p1[0], y, scale, shift) -- lines.append((pt[0], pt[1], pt[0] + yTickLength, pt[1])) -+ lines.append((int(pt[0]), int(pt[1]), int(pt[0] + yTickLength), int(pt[1]))) - dc.DrawLineList(lines) - if ticks.right: - lines = [] - for y, label in yticks: - pt = scale_and_shift_point(p2[0], y, scale, shift) -- lines.append((pt[0], pt[1], pt[0] - yTickLength, pt[1])) -+ lines.append((int(pt[0]), int(pt[1]), int(pt[0] - yTickLength), int(pt[1]))) - dc.DrawLineList(lines) - - @TempStyle('pen') -@@ -2531,25 +2531,25 @@ class PlotCanvas(wx.Panel): - # increases thickness for printing only - pen = self.centerLinePen - penWidth = self.printerScale * pen.GetWidth() -- pen.SetWidth(penWidth) -+ pen.SetWidth(int(penWidth)) - dc.SetPen(pen) - - if self._centerLinesEnabled in ('Horizontal', True): - y1 = scale[1] * p1[1] + shift[1] - y2 = scale[1] * p2[1] + shift[1] - y = (y1 - y2) / 2.0 + y2 -- dc.DrawLine(scale[0] * p1[0] + shift[0], -- y, -- scale[0] * p2[0] + shift[0], -- y) -+ dc.DrawLine(int(scale[0] * p1[0] + shift[0]), -+ int(y), -+ int(scale[0] * p2[0] + shift[0]), -+ int(y)) - if self._centerLinesEnabled in ('Vertical', True): - x1 = scale[0] * p1[0] + shift[0] - x2 = scale[0] * p2[0] + shift[0] - x = (x1 - x2) / 2.0 + x2 -- dc.DrawLine(x, -- scale[1] * p1[1] + shift[1], -- x, -- scale[1] * p2[1] + shift[1]) -+ dc.DrawLine(int(x), -+ int(scale[1] * p1[1] + shift[1]), -+ int(x), -+ int(scale[1] * p2[1] + shift[1])) - - @TempStyle('pen') - def _drawDiagonals(self, dc, p1, p2, scale, shift): -@@ -2575,19 +2575,19 @@ class PlotCanvas(wx.Panel): - """ - pen = self.diagonalPen - penWidth = self.printerScale * pen.GetWidth() -- pen.SetWidth(penWidth) -+ pen.SetWidth(int(penWidth)) - dc.SetPen(pen) - - if self._diagonalsEnabled in ('Bottomleft-Topright', True): -- dc.DrawLine(scale[0] * p1[0] + shift[0], -- scale[1] * p1[1] + shift[1], -- scale[0] * p2[0] + shift[0], -- scale[1] * p2[1] + shift[1]) -+ dc.DrawLine(int(scale[0] * p1[0] + shift[0]), -+ int(scale[1] * p1[1] + shift[1]), -+ int(scale[0] * p2[0] + shift[0]), -+ int(scale[1] * p2[1] + shift[1])) - if self._diagonalsEnabled in ('Bottomright-Topleft', True): -- dc.DrawLine(scale[0] * p1[0] + shift[0], -- scale[1] * p2[1] + shift[1], -- scale[0] * p2[0] + shift[0], -- scale[1] * p1[1] + shift[1]) -+ dc.DrawLine(int(scale[0] * p1[0] + shift[0]), -+ int(scale[1] * p2[1] + shift[1]), -+ int(scale[0] * p2[0] + shift[0]), -+ int(scale[1] * p1[1] + shift[1])) - - @TempStyle('pen') - def _drawAxes(self, dc, p1, p2, scale, shift): -@@ -2614,7 +2614,7 @@ class PlotCanvas(wx.Panel): - # increases thickness for printing only - pen = self.axesPen - penWidth = self.printerScale * pen.GetWidth() -- pen.SetWidth(penWidth) -+ pen.SetWidth(int(penWidth)) - dc.SetPen(pen) - - axes = self.enableAxes -@@ -2623,24 +2623,24 @@ class PlotCanvas(wx.Panel): - lower, upper = p1[0], p2[0] - a1 = scale_and_shift_point(lower, p1[1], scale, shift) - a2 = scale_and_shift_point(upper, p1[1], scale, shift) -- dc.DrawLine(a1[0], a1[1], a2[0], a2[1]) -+ dc.DrawLine(int(a1[0]), int(a1[1]), int(a2[0]), int(a2[1])) - if axes.top: - lower, upper = p1[0], p2[0] - a1 = scale_and_shift_point(lower, p2[1], scale, shift) - a2 = scale_and_shift_point(upper, p2[1], scale, shift) -- dc.DrawLine(a1[0], a1[1], a2[0], a2[1]) -+ dc.DrawLine(int(a1[0]), int(a1[1]), int(a2[0]), int(a2[1])) - - if self.ySpec != 'none': - if axes.left: - lower, upper = p1[1], p2[1] - a1 = scale_and_shift_point(p1[0], lower, scale, shift) - a2 = scale_and_shift_point(p1[0], upper, scale, shift) -- dc.DrawLine(a1[0], a1[1], a2[0], a2[1]) -+ dc.DrawLine(int(a1[0]), int(a1[1]), int(a2[0]), int(a2[1])) - if axes.right: - lower, upper = p1[1], p2[1] - a1 = scale_and_shift_point(p2[0], lower, scale, shift) - a2 = scale_and_shift_point(p2[0], upper, scale, shift) -- dc.DrawLine(a1[0], a1[1], a2[0], a2[1]) -+ dc.DrawLine(int(a1[0]), int(a1[1]), int(a2[0]), int(a2[1])) - - @TempStyle('pen') - def _drawAxesValues(self, dc, p1, p2, scale, shift, xticks, yticks): -@@ -2686,8 +2686,8 @@ class PlotCanvas(wx.Panel): - w = dc.GetTextExtent(label)[0] - pt = scale_and_shift_point(x, p1[1], scale, shift) - coords.append( -- (pt[0] - w/2, -- pt[1] + 2 * self._pointSize[1] - xTickLength) -+ (int(pt[0] - w/2), -+ int(pt[1] + 2 * self._pointSize[1] - xTickLength)) - ) - dc.DrawTextList(labels, coords) - -@@ -2698,8 +2698,8 @@ class PlotCanvas(wx.Panel): - w, h = dc.GetTextExtent(label) - pt = scale_and_shift_point(x, p2[1], scale, shift) - coords.append( -- (pt[0] - w/2, -- pt[1] - 2 * self._pointSize[1] - h - xTickLength) -+ (int(pt[0] - w/2), -+ int(pt[1] - 2 * self._pointSize[1] - h - xTickLength)) - ) - dc.DrawTextList(labels, coords) - -@@ -2712,8 +2712,8 @@ class PlotCanvas(wx.Panel): - w = dc.GetTextExtent(label)[0] - pt = scale_and_shift_point(p1[0], y, scale, shift) - coords.append( -- (pt[0] - w - 3 * self._pointSize[0] + yTickLength, -- pt[1] - 0.5 * h) -+ (int(pt[0] - w - 3 * self._pointSize[0] + yTickLength), -+ int(pt[1] - 0.5 * h)) - ) - dc.DrawTextList(labels, coords) - -@@ -2725,8 +2725,8 @@ class PlotCanvas(wx.Panel): - w = dc.GetTextExtent(label)[0] - pt = scale_and_shift_point(p2[0], y, scale, shift) - coords.append( -- (pt[0] + 3 * self._pointSize[0] + yTickLength, -- pt[1] - 0.5 * h) -+ (int(pt[0] + 3 * self._pointSize[0] + yTickLength), -+ int(pt[1] - 0.5 * h)) - ) - dc.DrawTextList(labels, coords) - -@@ -2785,7 +2785,7 @@ class PlotCanvas(wx.Panel): - + (self.plotbox_size[0] - lhsW - rhsW) / 2. - titleWH[0] / 2., - self.plotbox_origin[1] - self.plotbox_size[1] - ) -- dc.DrawText(graphics.title, titlePos[0], titlePos[1]) -+ dc.DrawText(graphics.title, int(titlePos[0]), int(titlePos[1])) - - def _drawAxesLabels(self, dc, graphics, lhsW, rhsW, bottomH, topH, - xLabelWH, yLabelWH): -@@ -2806,7 +2806,7 @@ class PlotCanvas(wx.Panel): - + (self.plotbox_size[0] - lhsW - rhsW) / 2. - xLabelWH[0] / 2., - self.plotbox_origin[1] - xLabelWH[1] - yTickLength - ) -- dc.DrawText(graphics.xLabel, xLabelPos[0], xLabelPos[1]) -+ dc.DrawText(graphics.xLabel, int(xLabelPos[0]), int(xLabelPos[1])) - yLabelPos = ( - self.plotbox_origin[0] - 3 * self._pointSize[0] + xTickLength, - self.plotbox_origin[1] - bottomH -@@ -2814,7 +2814,7 @@ class PlotCanvas(wx.Panel): - ) - if graphics.yLabel: # bug fix for Linux - dc.DrawRotatedText( -- graphics.yLabel, yLabelPos[0], yLabelPos[1], 90) -+ graphics.yLabel, int(yLabelPos[0]), int(yLabelPos[1]), 90) - - @TempStyle('pen') - def _drawPlotAreaLabels(self, dc, graphics, lhsW, rhsW, titleWH, -@@ -2942,7 +2942,7 @@ class PlotCanvas(wx.Panel): - if pos >= 0: - pagesize = int((r_current[1] - r_current[0]) / unit) - -- self.sb_hor.SetScrollbar(pos, pagesize, sbfullrange, pagesize) -+ self.sb_hor.SetScrollbar(pos, pagesize, int(sbfullrange), pagesize) - self._sb_xunit = unit - needScrollbars = needScrollbars or (pagesize != sbfullrange) - else: -@@ -2964,7 +2964,7 @@ class PlotCanvas(wx.Panel): - if pos >= 0: - pagesize = int((r_current[1] - r_current[0]) / unit) - pos = (sbfullrange - 1 - pos - pagesize) -- self.sb_vert.SetScrollbar(pos, pagesize, sbfullrange, pagesize) -+ self.sb_vert.SetScrollbar(int(pos), pagesize, int(sbfullrange), pagesize) - self._sb_yunit = unit - needScrollbars = needScrollbars or (pagesize != sbfullrange) - else: ---- a/wx/lib/plot/polyobjects.py -+++ b/wx/lib/plot/polyobjects.py -@@ -417,7 +417,7 @@ class PolyLine(PolyPoints): - - if not isinstance(colour, wx.Colour): - colour = wx.Colour(colour) -- pen = wx.Pen(colour, width, style) -+ pen = wx.Pen(colour, int(width), style) - pen.SetCap(wx.CAP_BUTT) - dc.SetPen(pen) - if coord is None: -@@ -518,7 +518,7 @@ class PolySpline(PolyLine): - style = self.attributes['style'] - if not isinstance(colour, wx.Colour): - colour = wx.Colour(colour) -- pen = wx.Pen(colour, width, style) -+ pen = wx.Pen(colour, int(width), style) - pen.SetCap(wx.CAP_ROUND) - dc.SetPen(pen) - if coord is None: -@@ -590,7 +590,7 @@ class PolyMarker(PolyPoints): - if fillcolour and not isinstance(fillcolour, wx.Colour): - fillcolour = wx.Colour(fillcolour) - -- dc.SetPen(wx.Pen(colour, width)) -+ dc.SetPen(wx.Pen(colour, int(width))) - if fillcolour: - dc.SetBrush(wx.Brush(fillcolour, fillstyle)) - else: -@@ -618,6 +618,7 @@ class PolyMarker(PolyPoints): - dc.DrawEllipseList(rect.astype(np.int32)) - - def _dot(self, dc, coords, size=1): -+ coords = [(int(c[0]), int(c[1])) for c in coords] - dc.DrawPointList(coords) - - def _square(self, dc, coords, size=1): -@@ -699,7 +700,7 @@ class PolyBarsBase(PolyPoints): - - if not isinstance(pencolour, wx.Colour): - pencolour = wx.Colour(pencolour) -- pen = wx.Pen(pencolour, penwidth, penstyle) -+ pen = wx.Pen(pencolour, int(penwidth), penstyle) - pen.SetCap(wx.CAP_BUTT) - - if not isinstance(fillcolour, wx.Colour): -@@ -790,6 +791,7 @@ class PolyBars(PolyBarsBase): - raise TypeError(err_str.format(type(barwidth))) - - rects = [self.calc_rect(x, y, w) for x, y, w in pts] -+ rects = [(int(r[0]), int(r[1]), int(r[2]), int(r[3])) for r in rects] - dc.DrawRectangleList(rects) - else: - dc.DrawLines(coord) # draw legend line -@@ -858,6 +860,8 @@ class PolyHistogram(PolyBarsBase): - rects = [self.calc_rect(y, low, high) - for y, (low, high) - in zip(self.hist, self.bins)] -+ rects = [(int(r[0]), int(r[1]), int(r[2]), int(r[3])) -+ for r in rects] - - dc.DrawRectangleList(rects) - else: -@@ -1114,10 +1118,10 @@ class PolyBoxPlot(PolyPoints): - self.currentShift) - - # rectangles are drawn (left, top, width, height) so adjust -- iqr_box = [iqr_box[0][0], # X (left) -- iqr_box[0][1], # Y (top) -- iqr_box[1][0] - iqr_box[0][0], # Width -- iqr_box[1][1] - iqr_box[0][1]] # Height -+ iqr_box = [int(iqr_box[0][0]), # X (left) -+ int(iqr_box[0][1]), # Y (top) -+ int(iqr_box[1][0] - iqr_box[0][0]), # Width -+ int(iqr_box[1][1] - iqr_box[0][1])] # Height - - box_pen = wx.Pen(wx.BLACK, 3, wx.PENSTYLE_SOLID) - box_brush = wx.Brush(wx.GREEN, wx.BRUSHSTYLE_SOLID) -@@ -1503,7 +1507,7 @@ class PlotPrintout(wx.Printout): - self.graph._setSize(plotAreaW, plotAreaH) - - # Set offset and scale -- dc.SetDeviceOrigin(pixLeft, pixTop) -+ dc.SetDeviceOrigin(int(pixLeft), int(pixTop)) - - # Thicken up pens and increase marker size for printing - ratioW = float(plotAreaW) / clientDcSize[0] ---- a/wx/lib/popupctl.py -+++ b/wx/lib/popupctl.py -@@ -124,7 +124,7 @@ class PopupDialog(wx.Dialog): - selfSize = self.GetSize() - tcSize = self.ctrl.GetSize() - -- pos.x -= (selfSize.width - tcSize.width) / 2 -+ pos.x -= (selfSize.width - tcSize.width) // 2 - if pos.x + selfSize.width > dSize.width: - pos.x = dSize.width - selfSize.width - if pos.x < 0: ---- a/wx/lib/scrolledpanel.py -+++ b/wx/lib/scrolledpanel.py -@@ -222,4 +222,4 @@ class ScrolledPanel(wx.ScrolledWindow): - # if we need to adjust - if new_vs_x != -1 or new_vs_y != -1: - #print("%s: (%s, %s)" % (self.GetName(), new_vs_x, new_vs_y)) -- self.Scroll(new_vs_x, new_vs_y) -+ self.Scroll(int(new_vs_x), int(new_vs_y)) ---- a/wx/lib/throbber.py -+++ b/wx/lib/throbber.py -@@ -200,11 +200,11 @@ class Throbber(wx.Panel): - """ - dc.DrawBitmap(self.submaps[self.sequence[self.current]], 0, 0, True) - if self.overlay and self.showOverlay: -- dc.DrawBitmap(self.overlay, self.overlayX, self.overlayY, True) -+ dc.DrawBitmap(self.overlay, int(self.overlayX), int(self.overlayY), True) - if self.label and self.showLabel: -- dc.DrawText(self.label, self.labelX, self.labelY) -+ dc.DrawText(self.label, int(self.labelX), int(self.labelY)) - dc.SetTextForeground(wx.WHITE) -- dc.DrawText(self.label, self.labelX-1, self.labelY-1) -+ dc.DrawText(self.label, int(self.labelX-1), int(self.labelY-1)) - - - def OnPaint(self, event): ---- a/wx/lib/ticker.py -+++ b/wx/lib/ticker.py -@@ -86,7 +86,7 @@ class Ticker(wx.Control): - def Start(self): - """Starts the text moving""" - if not self.timer.IsRunning(): -- self.timer.Start(1000 / self._fps) -+ self.timer.Start(1000 // self._fps) - - - def IsTicking(self): -@@ -208,7 +208,7 @@ class Ticker(wx.Control): - offx = self._offset - self._extent[0] - else: - offx = self.GetSize()[0] - self._offset -- offy = (self.GetSize()[1] - self._extent[1]) / 2 #centered vertically -+ offy = (self.GetSize()[1] - self._extent[1]) // 2 #centered vertically - dc.DrawText(self._text, offx, offy) - - diff --git a/_multibuild b/_multibuild index a5e4a0f..087b0f9 100644 --- a/_multibuild +++ b/_multibuild @@ -1,7 +1,7 @@ python3 - python36 python38 python39 python310 + python311 diff --git a/additional-310-fixes.patch b/additional-310-fixes.patch deleted file mode 100644 index 253ed63..0000000 --- a/additional-310-fixes.patch +++ /dev/null @@ -1,83 +0,0 @@ ---- - docker/build/ubuntu-18.04/Dockerfile | 4 +++- - docker/build/ubuntu-20.04/Dockerfile | 2 +- - wx/lib/agw/flatnotebook.py | 14 +++++++------- - wx/svg/__init__.py | 4 ++-- - 4 files changed, 13 insertions(+), 11 deletions(-) - ---- a/docker/build/ubuntu-18.04/Dockerfile -+++ b/docker/build/ubuntu-18.04/Dockerfile -@@ -53,6 +53,7 @@ RUN \ - apt-get install -y python3.7 python3.7-dev libpython3.7-dev python3.7-venv; \ - apt-get install -y python3.8 python3.8-dev libpython3.8-dev python3.8-venv; \ - apt-get install -y python3.9 python3.9-dev libpython3.9-dev python3.9-venv; \ -+ apt-get install -y python3.10 python3.10-dev libpython3.10-dev python3.10-venv; \ - apt-get clean; - - # Add files from host into the container -@@ -72,7 +73,8 @@ RUN \ - python3.6 -m venv venvs/Py36; \ - python3.7 -m venv venvs/Py37; \ - python3.8 -m venv venvs/Py38; \ -- python3.9 -m venv venvs/Py39; -+ python3.9 -m venv venvs/Py39; \ -+ python3.10 -m venv venvs/Py310; - - # Define default command - CMD ["/bin/bash", "-l"] ---- a/docker/build/ubuntu-20.04/Dockerfile -+++ b/docker/build/ubuntu-20.04/Dockerfile -@@ -3,7 +3,7 @@ FROM ubuntu:20.04 - - # Set environment variables - ENV DIST_NAME=ubuntu-20.04 --ENV USE_DEADSNAKES=no -+ENV USE_DEADSNAKES=yes - ENV USER=wxpy - ENV HOME=/home/$USER - ENV PYTHONUNBUFFERED=1 ---- a/wx/lib/agw/flatnotebook.py -+++ b/wx/lib/agw/flatnotebook.py -@@ -925,14 +925,14 @@ def DrawButton(dc, rect, focus, upperTab - - if focus: - if upperTabs: -- leftPt = wx.Point(rect.x, rect.y + (rect.height / 10)*8) -- rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 10)*8) -+ leftPt = wx.Point(rect.x, int(rect.y + (rect.height / 10)*8)) -+ rightPt = wx.Point(rect.x + rect.width - 2, int(rect.y + (rect.height / 10)*8)) - else: -- leftPt = wx.Point(rect.x, rect.y + (rect.height / 10)*5) -- rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 10)*5) -+ leftPt = wx.Point(rect.x, int(rect.y + (rect.height / 10)*5)) -+ rightPt = wx.Point(rect.x + rect.width - 2, int(rect.y + (rect.height / 10)*5)) - else: -- leftPt = wx.Point(rect.x, rect.y + (rect.height / 2)) -- rightPt = wx.Point(rect.x + rect.width - 2, rect.y + (rect.height / 2)) -+ leftPt = wx.Point(rect.x, int(rect.y + (rect.height / 2))) -+ rightPt = wx.Point(rect.x + rect.width - 2, int(rect.y + (rect.height / 2))) - - # Define the top region - top = wx.Rect(rect.GetTopLeft(), rightPt) -@@ -2765,7 +2765,7 @@ class FNBRendererFirefox2(FNBRenderer): - if pageTextColour is not None: - dc.SetTextForeground(pageTextColour) - -- dc.DrawText(pc.GetPageText(tabIdx), posx + textOffset, imageYCoord) -+ dc.DrawText(pc.GetPageText(tabIdx), int(posx + textOffset), imageYCoord) - - # draw 'x' on tab (if enabled) - if pc.HasAGWFlag(FNB_X_ON_TAB) and tabIdx == pc.GetSelection(): ---- a/wx/svg/__init__.py -+++ b/wx/svg/__init__.py -@@ -132,8 +132,8 @@ class SVGimage(SVGimageBase): - """ - size = wx.Size(*size) - if window: -- size.width *= window.GetContentScaleFactor() -- size.height *= window.GetContentScaleFactor() -+ size.width = int(size.width * window.GetContentScaleFactor()) -+ size.height = int(size.height * window.GetContentScaleFactor()) - - # We can only have one overall scale factor for both dimensions with - # this rasterization method, so chose either the minimum of width or diff --git a/fix_no_return_in_nonvoid.patch b/fix_no_return_in_nonvoid.patch deleted file mode 100644 index 45a5a26..0000000 --- a/fix_no_return_in_nonvoid.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -U 3 -H -w -E -d -r -x .osc -- a/sip/cpp/sip_corewxTextCtrl.cpp b/sip/cpp/sip_corewxTextCtrl.cpp ---- a/sip/cpp/sip_corewxTextCtrl.cpp -+++ b/sip/cpp/sip_corewxTextCtrl.cpp -@@ -55,12 +55,16 @@ - { - #ifdef __WXMSW__ - return self->ShowNativeCaret(show); -+ #else -+ return false; - #endif - } - bool _wxTextCtrl_HideNativeCaret(wxTextCtrl* self) - { - #ifdef __WXMSW__ - return self->HideNativeCaret(); -+ #else -+ return false; - #endif - } - void _wxTextCtrl_write(wxTextCtrl* self, const wxString* text) diff --git a/python-wxPython.changes b/python-wxPython.changes index 9ff20e6..aa323b8 100644 --- a/python-wxPython.changes +++ b/python-wxPython.changes @@ -1,3 +1,38 @@ +------------------------------------------------------------------- +Sat Aug 13 23:03:31 UTC 2022 - Stefan Brüns + +- Update to relase 4.2.0, matching wxWidgets 3.2.0 + For a detailed changelog, see + https://www.wxpython.org/news/2022-08-07-wxpython-411-release/index.html +- Drop patch obsoleted by upstream changes: + * 0002-SIP-6.5-compat.patch +- Do not depend on pip for downloading in wxget, add + 0003-Make-pip-usage-in-wxget-optional.patch +- Fix a wrong type size on 32 bit archs, add + 0004-Fix-time_t-ETG-typedef-extend-DateTime.FromTimeT-tes.patch + +------------------------------------------------------------------- +Sun Jun 26 13:46:42 UTC 2022 - Stefan Brüns + +- Update to current git version for wxWidgets 3.1.6/3.1.7 + compatibility. +- Drop upstream patches: + * fix_no_return_in_nonvoid.patch + * wxPython-4.1.1-fix-overrides.patch + * 2039-bunch-py310-fixes.patch + * additional-310-fixes.patch +- Regenerate bindings from wxWidgets 3.1.7 code +- Allow SIP generation with SIP 6.x < 6.6, + * 0001-Only-import-attrdict-where-needed.patch + * 0002-SIP-6.5-compat.patch +- Add patches for test suite (pending): + * 0001-Check-HSV-values-in-image-test.patch + * 0001-Fix-overflow-check-for-wxUIntPtr-type.patch +- Add some more dependencies required for the test suite +- Disable some tests which can not succeed +- Enable test suite by default +- Do not ship copy of wxWidgets locale + ------------------------------------------------------------------- Wed Jan 5 11:12:25 UTC 2022 - Ben Greiner diff --git a/python-wxPython.spec b/python-wxPython.spec index 04b2170..e0771fc 100644 --- a/python-wxPython.spec +++ b/python-wxPython.spec @@ -17,8 +17,13 @@ %define X_display ":98" -%bcond_with test +%bcond_without test %bcond_without syswx +# We rebuild the ETG and SIP files for two reasons: +# - Fixing a bug in the ETG time_t typedef (see patch) +# - Compatibility with SIP 6.5.x, for Leap 15.x +%bcond_without rebuild_sip + %if %{with syswx} %define wx_args --use_syswx --gtk3 -v %else @@ -40,9 +45,6 @@ ExclusiveArch: donotbuild # Extraneous build_flavors and skips are excluded automatically so future # additions can be included here early and old flavors can be removed some time # after the global drop in Factory. -%if "%flavor" != "python36" -%define skip_python36 1 -%endif %if "%flavor" != "python38" %define skip_python38 1 %endif @@ -52,6 +54,9 @@ ExclusiveArch: donotbuild %if "%flavor" != "python310" %define skip_python310 1 %endif +%if "%flavor" != "python311" +%define skip_python311 1 +%endif %else # SLE/Leap: python3 only %if "%flavor" != "python3" @@ -76,7 +81,7 @@ ExclusiveArch: donotbuild %endif Name: %{pprefix}-wxPython -Version: 4.1.1 +Version: 4.2.0 Release: 0 Summary: The "Phoenix" variant of the wxWidgets Python bindings License: GPL-2.0-or-later @@ -84,18 +89,18 @@ Group: System/Libraries URL: https://github.com/wxWidgets/Phoenix Source: https://files.pythonhosted.org/packages/source/w/wxPython/wxPython-%{version}.tar.gz Source1: python-wxPython-rpmlintrc -# PATCH-FIX-OPENSUSE fix_no_return_in_nonvoid.patch -- Fix lack of return in nonvoid functions -Patch0: fix_no_return_in_nonvoid.patch # PATCH-FIX-OPENSUSE Patch1: use_stl_build.patch -# PATCH-FIX-UPSTREAM wxPython-4.1.1-fix-overrides.patch -- Fix build with wxWidgets 3.1.5 (gh#wxWidgets/Phoenix#1909) -Patch2: wxPython-4.1.1-fix-overrides.patch -# PATCH-FIX-UPSTREAM 2039-bunch-py310-fixes.patch gh#wxWidgets/Phoenix#2039 mcepl@suse.com -# Fix a bunch of Python 3.10 issues with pure-Python classes and demos -Patch3: 2039-bunch-py310-fixes.patch -# PATCH-FIX-UPSTREAM additional-310-fixes.patch bsc#[0-9]+ mcepl@suse.com -# collection of patches: -Patch4: additional-310-fixes.patch +# PATCH-FIX-UPSTREAM +Patch2: 0001-Only-import-attrdict-where-needed.patch +# PATCH-FIX-UPSTREAM - https://github.com/wxWidgets/Phoenix/pull/2232 +Patch4: 0003-Make-pip-usage-in-wxget-optional.patch +# PATCH-FIX-OPENSUSE +Patch5: 0004-Fix-time_t-ETG-typedef-extend-DateTime.FromTimeT-tes.patch +# PATCH-FIX-OPENSUSE - Test fixes/additions: +Patch112: 0001-Check-HSV-values-in-image-test.patch +# PATCH-FIX-UPSTREAM - https://github.com/wxWidgets/Phoenix/pull/2233 +Patch113: 0001-Fix-overflow-check-for-wxUIntPtr-type.patch BuildRequires: %{python_module base} BuildRequires: %{python_module devel} BuildRequires: %{python_module requests} @@ -105,7 +110,10 @@ BuildRequires: fdupes BuildRequires: pkgconfig BuildRequires: python-rpm-macros %if %{with syswx} -BuildRequires: wxGTK3-devel >= 3.1.5 +BuildRequires: %{python_module sip6-devel >= 6.5.1} +BuildRequires: waf +BuildRequires: wxGTK3-devel >= 3.2.0 +BuildRequires: wxWidgets-3_2-doc-xml >= 3.2.0 %else BuildRequires: freeglut-devel BuildRequires: gstreamer-plugins-base-devel @@ -141,9 +149,10 @@ BuildRequires: %{python_module numpy} BuildRequires: %{python_module pytest-xdist} BuildRequires: %{python_module pytest} BuildRequires: %{python_module six} +BuildRequires: Mesa-dri # Need at least one font installed BuildRequires: google-opensans-fonts -BuildRequires: wxWidgets-lang +# BuildRequires: wxWidgets-lang BuildRequires: xorg-x11-server BuildRequires: pkgconfig(cppunit) %endif @@ -175,6 +184,13 @@ Provides translations to the package %{name}. %prep %autosetup -n wxPython-%{version} -p1 +# Lower minimum Python version +sed -i -e '/check_python_version/ s@3,7,0@3,6,0@' wscript + +# Reuse locale from wxWidgets package +%if %{with syswx} +rm -Rf wx/locale +%endif sed -i -e '/^#!\//, 1d' wx/py/*.py sed -i -e '/^#!\//, 1d' wx/tools/*.py @@ -183,7 +199,30 @@ echo "# empty module" >> wx/lib/pubsub/core/itopicdefnprovider.py %build export CFLAGS="%{optflags}" + +%if %{with rebuild_sip} +# Save LICENSE* files from bundled siplib +mv sip/siplib{,_old} + export DOXYGEN=%{_bindir}/doxygen +export SIP=%{_bindir}/sip +export WAF=%{_bindir}/waf +mkdir -p /tmp/wxxml/docs/doxygen/out/ +rm -f /tmp/wxxml/docs/doxygen/out/xml +cp ext/wxWidgets/docs/*.txt /tmp/wxxml/docs/ +ln -sf %{_docdir}/wxWidgets*doc-xml /tmp/wxxml/docs/doxygen/out/xml +export WXWIN=/tmp/wxxml/ + +%python_exec build.py touch %{wx_args} +%python_exec build.py etg --nodoc %{wx_args} +%python_exec build.py sip %{wx_args} +cp sip/siplib_old/LICENSE* sip/siplib/ +if [ ! -e sip/siplib/sip_array.c ]; then + cp sip/siplib/{,sip_}array.c + cp sip/siplib/{,sip_}array.h +fi +%endif + %python_exec build.py build %{wx_args} %install @@ -204,7 +243,9 @@ export DOXYGEN=%{_bindir}/doxygen %python_clone -a %{buildroot}%{_bindir}/wxdocs %python_clone -a %{buildroot}%{_bindir}/wxget +%if %{without syswx} %find_lang wxstd +%endif %check %if %{with test} @@ -225,8 +266,13 @@ mv wx wx_temp %pytest_arch --forked -n 1 -k 'test_uiaction or test_mousemanager' unittests/ # Skip Auto ID management test (only enabled on Windows) # Skip Frame restore (requires a window manager) +# Skip Locale.GetString, we do not ship translations for wxWidgets-3_2 +# Skip wx.lib.pubsub, fails due to PYTHONDONTWRITEBYTECODE, also deprecated for pypubsub # Skip UiAction tests (already done) -%pytest_arch --forked -n auto -k '(not test_newIdRef03) and (not test_uiaction) and (not test_mousemanager) and (not test_frameRestore)' unittests/ +%{pytest_arch --forked -n 4 -k \ + '(not test_newIdRef03) and (not test_uiaction) and (not test_mousemanager) and (not test_frameRestore) and (not test_intlGetString) and (not lib_pubsub_Except) and (not test_xrc7)' \ + unittests/ +} mv wx_temp wx %endif @@ -252,13 +298,17 @@ mv wx_temp wx %python_alternative %{_bindir}/wxdemo %python_alternative %{_bindir}/wxdocs %python_alternative %{_bindir}/wxget -%{python_sitearch}/wxPython-%{version}-py*.egg-info +%{python_sitearch}/wxPython-*-py*.egg-info %{python_sitearch}/wx/ +%if %{without syswx} %exclude %{python_sitearch}/wx/locale/ +%endif +%if %{without syswx} %files lang -f wxstd.lang %dir %{python_sitearch}/wx/locale/ %dir %{python_sitearch}/wx/locale/* %dir %{python_sitearch}/wx/locale/*/LC_MESSAGES +%endif %changelog diff --git a/use_stl_build.patch b/use_stl_build.patch index ae32a84..b142338 100644 --- a/use_stl_build.patch +++ b/use_stl_build.patch @@ -1,10 +1,11 @@ --- wxPython-4.1.0/buildtools/build_wxwidgets.py_orig 2020-05-30 01:24:47.890132236 +0200 +++ wxPython-4.1.0/buildtools/build_wxwidgets.py 2020-05-30 01:25:59.574988273 +0200 -@@ -362,6 +362,7 @@ - else: - configure_opts.append("--enable-universal_binary=%s" % options.mac_universal_binary) +@@ -370,6 +370,8 @@ + if os.path.exists(frameworkRootDir): + shutil.rmtree(frameworkRootDir) + configure_opts.append("--enable-stl") - ++ print("Configure options: " + repr(configure_opts)) wxBuilder = builder.AutoconfBuilder() + if not options.no_config and not options.clean: diff --git a/wxPython-4.1.1-fix-overrides.patch b/wxPython-4.1.1-fix-overrides.patch deleted file mode 100644 index 99cfd49..0000000 --- a/wxPython-4.1.1-fix-overrides.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- wxPython-4.1.1.orig/sip/cpp/sip_gridwxGridEvent.cpp 2020-11-21 20:10:38.000000000 +0100 -+++ wxPython-4.1.1/sip/cpp/sip_gridwxGridEvent.cpp 2021-05-16 03:21:55.031555889 +0200 -@@ -32,8 +32,8 @@ - * this class. - */ - protected: -- int GetRow() SIP_OVERRIDE; -- int GetCol() SIP_OVERRIDE; -+ int GetRow(); -+ int GetCol(); - ::wxEvent* Clone() const SIP_OVERRIDE; - ::wxEventCategory GetEventCategory() const SIP_OVERRIDE; - diff --git a/wxPython-4.1.1.tar.gz b/wxPython-4.1.1.tar.gz deleted file mode 100644 index d0be1fd..0000000 --- a/wxPython-4.1.1.tar.gz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00e5e3180ac7f2852f342ad341d57c44e7e4326de0b550b9a5c4a8361b6c3528 -size 66043287 diff --git a/wxPython-4.2.0.tar.gz b/wxPython-4.2.0.tar.gz new file mode 100644 index 0000000..395f11b --- /dev/null +++ b/wxPython-4.2.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:663cebc4509d7e5d113518865fe274f77f95434c5d57bc386ed58d65ceed86c7 +size 70958238