From ff0538714fc6ed54d13dbf0971288d304d14cd99440d66d056a6fc21a0d5928f Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Tue, 4 Jan 2022 11:27:04 +0000 Subject: [PATCH 1/3] Accepting request 943732 from home:mcepl:branches:X11:wxWidgets - Add additional patches fixing the situation with Python 3.10 compatibility: - 2039-bunch-py310-fixes.patch (from gh#wxWidgets/Phoenix#2039) - additional-310-fixes.patch (from various commits on master) - Split out the TW python3 flavors into multibuild using the python_subpackage_only mechanism: Multiple python3 flavors sequentially require too much space and time in one build. OBS-URL: https://build.opensuse.org/request/show/943732 OBS-URL: https://build.opensuse.org/package/show/X11:wxWidgets/python-wxPython?expand=0&rev=29 --- 2039-bunch-py310-fixes.patch | 2981 ++++++++++++++++++++++++++++++++++ _constraints | 2 +- _multibuild | 6 + additional-310-fixes.patch | 83 + python-wxPython-rpmlintrc | 2 + python-wxPython.changes | 15 + python-wxPython.spec | 143 +- 7 files changed, 3211 insertions(+), 21 deletions(-) create mode 100644 2039-bunch-py310-fixes.patch create mode 100644 _multibuild create mode 100644 additional-310-fixes.patch diff --git a/2039-bunch-py310-fixes.patch b/2039-bunch-py310-fixes.patch new file mode 100644 index 0000000..230b635 --- /dev/null +++ b/2039-bunch-py310-fixes.patch @@ -0,0 +1,2981 @@ +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/_constraints b/_constraints index 33c3419..02387b4 100644 --- a/_constraints +++ b/_constraints @@ -1,7 +1,7 @@ - 15 + 8 diff --git a/_multibuild b/_multibuild new file mode 100644 index 0000000..de84037 --- /dev/null +++ b/_multibuild @@ -0,0 +1,6 @@ + + python36 + python38 + python39 + python310 + diff --git a/additional-310-fixes.patch b/additional-310-fixes.patch new file mode 100644 index 0000000..253ed63 --- /dev/null +++ b/additional-310-fixes.patch @@ -0,0 +1,83 @@ +--- + 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/python-wxPython-rpmlintrc b/python-wxPython-rpmlintrc index 67d25fd..eb3a8d8 100644 --- a/python-wxPython-rpmlintrc +++ b/python-wxPython-rpmlintrc @@ -1 +1,3 @@ addFilter("devel-file-in-non-devel-package") +# the multibuild flavors need differently named source packages +addFilter("invalid-spec-name") diff --git a/python-wxPython.changes b/python-wxPython.changes index 804322c..7cc5902 100644 --- a/python-wxPython.changes +++ b/python-wxPython.changes @@ -1,3 +1,18 @@ +------------------------------------------------------------------- +Tue Jan 4 10:18:08 UTC 2022 - Matej Cepl + +- Add additional patches fixing the situation with Python 3.10 + compatibility: + - 2039-bunch-py310-fixes.patch (from gh#wxWidgets/Phoenix#2039) + - additional-310-fixes.patch (from various commits on master) + +------------------------------------------------------------------- +Wed Dec 29 10:23:20 UTC 2021 - Ben Greiner + +- Split out the TW python3 flavors into multibuild using the + python_subpackage_only mechanism: Multiple python3 flavors + sequentially require too much space and time in one build. + ------------------------------------------------------------------- Sat Jun 12 16:32:57 UTC 2021 - Antoine Belvire diff --git a/python-wxPython.spec b/python-wxPython.spec index b003c5c..854ff27 100644 --- a/python-wxPython.spec +++ b/python-wxPython.spec @@ -1,7 +1,7 @@ # -# spec file for package python-wxPython +# spec file # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,9 +16,6 @@ # -%{?!python_module:%define python_module() python-%{**} python3-%{**}} -%define skip_python2 1 -%define oldpython python %define X_display ":98" %bcond_with test %bcond_without syswx @@ -27,11 +24,53 @@ %else %define wx_args --gtk3 -v %endif -%if %{with test} + +%global flavor @BUILD_FLAVOR@%{nil} +%if 0%{suse_version} >= 1550 +# Tumbleweed has a varying number of python3 flavors. Ideally, the flavor +# selection here and in _multibuild is in sync with the Factory prjconf +# definition for pythons, but if it is not, we build missing flavors in -other +# and do not build flavors which are not yet or not anymore in the buildset. +%define pprefix %flavor +%define psuffix -mb +%if "%flavor" != "python36" || %{with test} # No numpy for Python 3.6 %define skip_python36 1 %endif -Name: python-wxPython +%if "%flavor" != "python38" +%define skip_python38 1 +%endif +%if "%flavor" != "python39" +%define skip_python39 1 +%endif +%if "%flavor" != "python310" +%define skip_python310 1 +%endif +%if "%flavor" == "" +%define pprefix python +%define psuffix -other +%endif +# The obs server-side interpreter cannot use lua or rpm shrink +%if "%pythons" == "" || "%pythons" == " " || "%pythons" == " " || "%pythons" == " " +ExclusiveArch: donotbuild +%endif +%else +# The SLE/Leap python3 package is built without subpackage rewriting in the main flavor +%if "%flavor" == "" +%define pprefix python3 +%define psuffix %{nil} +%define pythons python3 +%define python_files() -n %{pprefix}-%{**} +%define python_module() python3-%{**} +%define python_version %python3_version +%define python_sitearch %python3_sitearch +%else +ExclusiveArch: donotbuild +%endif +%endif +%define plainpython python + +Name: %{pprefix}-wxPython%{psuffix} Version: 4.1.1 Release: 0 Summary: The "Phoenix" variant of the wxWidgets Python bindings @@ -46,6 +85,13 @@ Patch0: fix_no_return_in_nonvoid.patch 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 +BuildRequires: %{python_module base} BuildRequires: %{python_module devel} BuildRequires: %{python_module requests} BuildRequires: %{python_module setuptools} @@ -73,11 +119,6 @@ BuildRequires: pkgconfig(webkit2gtk-4.0) BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(xtst) %endif -Requires: python-six -Requires(post): update-alternatives -Requires(postun):update-alternatives -Conflicts: python-wxWidgets -Provides: python-wxWidgets = %{version} %if %{with test} BuildRequires: %{python_module numpy} BuildRequires: %{python_module pytest-xdist} @@ -89,11 +130,16 @@ BuildRequires: wxWidgets-lang BuildRequires: xorg-x11-server BuildRequires: pkgconfig(cppunit) %endif -%ifpython2 -Conflicts: %{oldpython}-wxWidgets -Provides: %{oldpython}-wxWidgets = %{version} -%endif +%if 0%{suse_version} >= 1550 +%define python_subpackage_only 1 %python_subpackages +%else +Requires: %{pprefix}-six +Requires(post): update-alternatives +Requires(postun):update-alternatives +Conflicts: %{pprefix}-wxWidgets +Provides: %{pprefix}-wxWidgets = %{version} +%endif %description Phoenix is a reimplementation of wxPython. Like the "classic" @@ -108,18 +154,49 @@ platform specific code. Summary: Languages for package %{name} Group: System/Libraries Requires: %{name} = %{version} -Requires: python-base +Requires: %{plainpython}(abi) = %python_version Supplements: (bundle-lang-other and %{name}) Provides: %{name}-lang-all = %{version} %description lang Provides translations to the package %{name}. +%package -n python-wxPython%{?nosub} +# extra definition for %%python_subpackage_only mechanism, keep in sync with main definitions. +Summary: The "Phoenix" variant of the wxWidgets Python bindings +Requires: python-six +Requires(post): update-alternatives +Requires(postun):update-alternatives +Conflicts: python-wxWidgets +Provides: python-wxWidgets = %{version} + +%description -n python-wxPython +Phoenix is a reimplementation of wxPython. Like the "classic" +wxPython, Phoenix wraps the wxWidgets C++ toolkit and provides access +to the user interface portions of the wxWidgets API, enabling Python +applications to have a GUI on Windows, macOS or Unix-like systems, +with a native look and feel and requiring very little (if any) +platform specific code. + +%package -n python-wxPython-lang +# We cannot use %%lang_package here. Editra translations use noarch incompatible path. +Summary: Languages for package %{pprefix}-wxPython +Group: System/Libraries +Requires: python-wxPython = %{version} +Requires: %{plainpython}(abi) = %python_version +Supplements: (bundle-lang-other and python-wxPython) +Provides: python-wxPython-lang-all = %{version} + +%description -n python-wxPython-lang +Provides translations to the package %pprefix-wxPython. + %prep %autosetup -n wxPython-%{version} -p1 + sed -i -e '/^#!\//, 1d' wx/py/*.py sed -i -e '/^#!\//, 1d' wx/tools/*.py sed -i -e '/^#!\//, 1d' wx/py/tests/*.py +echo "# empty module" >> wx/lib/pubsub/core/itopicdefnprovider.py %build export CFLAGS="%{optflags}" @@ -147,6 +224,21 @@ export DOXYGEN=%{_bindir}/doxygen %python_clone -a %{buildroot}%{_bindir}/wxdocs %python_clone -a %{buildroot}%{_bindir}/wxget +# Note: find_lang only works for one python flavor per multibuild, +# cannot use python_find_lang in python_subpackage_only mode. +%find_lang wxstd +%{python_expand # +echo "%%dir %{$python_sitearch}/wx/locale/ +%%dir %{$python_sitearch}/wx/locale/* +%%dir %{$python_sitearch}/wx/locale/*/LC_MESSAGES" >> wxstd.lang +} +%if "%psuffix" == "-other" +if [ $(echo %pythons | wc -w) -gt 1 ]; then + # could not collect for only one flavor, package locale files unmarked + echo "" > wxstd.lang +fi +%endif + %check %if %{with test} ############################################# @@ -172,13 +264,22 @@ mv wx wx_temp mv wx_temp wx %endif +%if 0%{?python_subpackage_only} +%post -n python-wxPython +%{python_install_alternative pywxrc helpviewer img2png img2py img2xpm pycrust pyshell pyslices pyslicesshell wxdemo wxdocs wxget} + +%postun -n python-wxPython +%{python_uninstall_alternative pywxrc} +%else + %post %{python_install_alternative pywxrc helpviewer img2png img2py img2xpm pycrust pyshell pyslices pyslicesshell wxdemo wxdocs wxget} %postun -%{python_uninstall_alternative pywxrc helpviewer img2png img2py img2xpm pycrust pyshell pyslices pyslicesshell wxdemo wxdocs wxget} +%{python_uninstall_alternative pywxrc} +%endif -%files %{python_files} +%files %{python_files wxPython} %license LICENSE.txt license/*.txt %doc CHANGES.rst README.rst TODO.rst %python_alternative %{_bindir}/helpviewer @@ -197,7 +298,9 @@ mv wx_temp wx %{python_sitearch}/wx/ %exclude %{python_sitearch}/wx/locale/ -%files %{python_files lang} +%files %{python_files wxPython-lang} -f wxstd.lang +%if "%psuffix" == "-other" %{python_sitearch}/wx/locale/ +%endif %changelog From 6c22f2ec19120595e0213b5299d58ee2b6388e79b22df9aabd669ec7ebb4f8fc Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Tue, 4 Jan 2022 18:01:55 +0000 Subject: [PATCH 2/3] Accepting request 943795 from home:bnavigator:branches:X11:wxWidgets - Appease factory-auto bot about package src name OBS-URL: https://build.opensuse.org/request/show/943795 OBS-URL: https://build.opensuse.org/package/show/X11:wxWidgets/python-wxPython?expand=0&rev=30 --- _multibuild | 1 + python-wxPython.changes | 5 +++++ python-wxPython.spec | 12 +++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/_multibuild b/_multibuild index de84037..a5e4a0f 100644 --- a/_multibuild +++ b/_multibuild @@ -1,4 +1,5 @@ + python3 python36 python38 python39 diff --git a/python-wxPython.changes b/python-wxPython.changes index 7cc5902..0ede1ba 100644 --- a/python-wxPython.changes +++ b/python-wxPython.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Tue Jan 4 13:58:38 UTC 2022 - Ben Greiner + +- Appease factory-auto bot about package src name + ------------------------------------------------------------------- Tue Jan 4 10:18:08 UTC 2022 - Matej Cepl diff --git a/python-wxPython.spec b/python-wxPython.spec index 854ff27..9fc79e0 100644 --- a/python-wxPython.spec +++ b/python-wxPython.spec @@ -26,6 +26,8 @@ %endif %global flavor @BUILD_FLAVOR@%{nil} +%define pprefix python +%define psuffix %{nil} %if 0%{suse_version} >= 1550 # Tumbleweed has a varying number of python3 flavors. Ideally, the flavor # selection here and in _multibuild is in sync with the Factory prjconf @@ -51,16 +53,16 @@ %define psuffix -other %endif # The obs server-side interpreter cannot use lua or rpm shrink -%if "%pythons" == "" || "%pythons" == " " || "%pythons" == " " || "%pythons" == " " +%if "%pythons" == "" || "%pythons" == " " || "%pythons" == " " || "%pythons" == " " || "%flavor" == "python3" ExclusiveArch: donotbuild +%define python_module() all-python-flavors-skipped-in-flavorless-multibuild %endif %else -# The SLE/Leap python3 package is built without subpackage rewriting in the main flavor -%if "%flavor" == "" +# The SLE/Leap python3 package is built without subpackage rewriting in its own flavor +%if "%flavor" == "python3" %define pprefix python3 -%define psuffix %{nil} %define pythons python3 -%define python_files() -n %{pprefix}-%{**} +%define python_files() -n python3-%{**} %define python_module() python3-%{**} %define python_version %python3_version %define python_sitearch %python3_sitearch From c2d36a9a668aaf7796cf086d23163bcdc116546e853b0db352d553eac6905d88 Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Wed, 5 Jan 2022 12:58:20 +0000 Subject: [PATCH 3/3] Accepting request 944031 from home:bnavigator:branches:X11:wxWidgets - Reduce complexity by not rewriting subpackages at all. Multibuild flavors now must be a superset of all existing python3 flavors. - The difference of a single whitespace character is significant OBS-URL: https://build.opensuse.org/request/show/944031 OBS-URL: https://build.opensuse.org/package/show/X11:wxWidgets/python-wxPython?expand=0&rev=31 --- python-wxPython.changes | 12 +++ python-wxPython.spec | 160 +++++++++++++++------------------------- 2 files changed, 70 insertions(+), 102 deletions(-) diff --git a/python-wxPython.changes b/python-wxPython.changes index 0ede1ba..9ff20e6 100644 --- a/python-wxPython.changes +++ b/python-wxPython.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Wed Jan 5 11:12:25 UTC 2022 - Ben Greiner + +- Reduce complexity by not rewriting subpackages at all. + Multibuild flavors now must be a superset of all existing + python3 flavors. + +------------------------------------------------------------------- +Tue Jan 4 22:28:51 UTC 2022 - Ben Greiner + +- The difference of a single whitespace character is significant + ------------------------------------------------------------------- Tue Jan 4 13:58:38 UTC 2022 - Ben Greiner diff --git a/python-wxPython.spec b/python-wxPython.spec index 9fc79e0..04b2170 100644 --- a/python-wxPython.spec +++ b/python-wxPython.spec @@ -26,17 +26,21 @@ %endif %global flavor @BUILD_FLAVOR@%{nil} +%if "%flavor" == "" +# factory-auto requires the main build_flavor to match the specfile name %define pprefix python -%define psuffix %{nil} -%if 0%{suse_version} >= 1550 -# Tumbleweed has a varying number of python3 flavors. Ideally, the flavor -# selection here and in _multibuild is in sync with the Factory prjconf -# definition for pythons, but if it is not, we build missing flavors in -other -# and do not build flavors which are not yet or not anymore in the buildset. +%define python_module() no-build-without-multibuild-flavor +ExclusiveArch: donotbuild +%else %define pprefix %flavor -%define psuffix -mb -%if "%flavor" != "python36" || %{with test} -# No numpy for Python 3.6 +%if 0%{suse_version} >= 1599 +# Tumbleweed has a varying number of python3 flavors. The flavor +# selection here and in _multibuild must be kept in sync with the Factory +# prjconf definition for pythons. If a skip is missing, all builds fail. +# 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" @@ -48,31 +52,30 @@ %if "%flavor" != "python310" %define skip_python310 1 %endif -%if "%flavor" == "" -%define pprefix python -%define psuffix -other +%else +# SLE/Leap: python3 only +%if "%flavor" != "python3" +%define pythons %{nil} +%else +%define pythons python3 +%define python3_provides %{nil} +%endif %endif # The obs server-side interpreter cannot use lua or rpm shrink -%if "%pythons" == "" || "%pythons" == " " || "%pythons" == " " || "%pythons" == " " || "%flavor" == "python3" +%if "%pythons" == "" || "%pythons" == " " || "%pythons" == " " || "%pythons" == " " || "%pythons" == " " ExclusiveArch: donotbuild -%define python_module() all-python-flavors-skipped-in-flavorless-multibuild -%endif +%define python_module() %flavor-not-enabled-in-buildset-for-suse-%{?suse_version} %else -# The SLE/Leap python3 package is built without subpackage rewriting in its own flavor -%if "%flavor" == "python3" -%define pprefix python3 -%define pythons python3 -%define python_files() -n python3-%{**} -%define python_module() python3-%{**} -%define python_version %python3_version -%define python_sitearch %python3_sitearch -%else -ExclusiveArch: donotbuild +%define python_files() -n %flavor-%{**} +%define python_module() %flavor-%{**} +%define python_exec python%{expand:%%%{flavor}_bin_suffix} +%define python_version %{expand:%%%{flavor}_version} +%define python_sitearch %{expand:%%%{flavor}_sitearch} +%define python_provides %{expand:%%%{flavor}_provides} %endif %endif -%define plainpython python -Name: %{pprefix}-wxPython%{psuffix} +Name: %{pprefix}-wxPython Version: 4.1.1 Release: 0 Summary: The "Phoenix" variant of the wxWidgets Python bindings @@ -121,6 +124,18 @@ BuildRequires: pkgconfig(webkit2gtk-4.0) BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(xtst) %endif +Requires: %{pprefix}-six +Requires(post): update-alternatives +Requires(postun):update-alternatives +Conflicts: %{pprefix}-wxWidgets +Provides: %{pprefix}-wxWidgets = %{version} +%if "%{python_provides}" != "" +# for TW primary flavor provider +Conflicts: %{python_provides}-wxWidgets +Provides: %{python_provides}-wxPython = %{version}-%{release} +Provides: %{python_provides}-wxWidgets = %{version} +Obsoletes: %{python_provides}-wxPython < %{version}-%{release} +%endif %if %{with test} BuildRequires: %{python_module numpy} BuildRequires: %{python_module pytest-xdist} @@ -132,16 +147,6 @@ BuildRequires: wxWidgets-lang BuildRequires: xorg-x11-server BuildRequires: pkgconfig(cppunit) %endif -%if 0%{suse_version} >= 1550 -%define python_subpackage_only 1 -%python_subpackages -%else -Requires: %{pprefix}-six -Requires(post): update-alternatives -Requires(postun):update-alternatives -Conflicts: %{pprefix}-wxWidgets -Provides: %{pprefix}-wxWidgets = %{version} -%endif %description Phoenix is a reimplementation of wxPython. Like the "classic" @@ -156,42 +161,18 @@ platform specific code. Summary: Languages for package %{name} Group: System/Libraries Requires: %{name} = %{version} -Requires: %{plainpython}(abi) = %python_version +Requires: python(abi) = %python_version Supplements: (bundle-lang-other and %{name}) Provides: %{name}-lang-all = %{version} +%if "%{python_provides}" != "" +# for TW primary flavor provider +Provides: %{python_provides}-wxPython-lang = %{version}-%{release} +Obsoletes: %{python_provides}-wxPython-lang < %{version}-%{release} +%endif %description lang Provides translations to the package %{name}. -%package -n python-wxPython%{?nosub} -# extra definition for %%python_subpackage_only mechanism, keep in sync with main definitions. -Summary: The "Phoenix" variant of the wxWidgets Python bindings -Requires: python-six -Requires(post): update-alternatives -Requires(postun):update-alternatives -Conflicts: python-wxWidgets -Provides: python-wxWidgets = %{version} - -%description -n python-wxPython -Phoenix is a reimplementation of wxPython. Like the "classic" -wxPython, Phoenix wraps the wxWidgets C++ toolkit and provides access -to the user interface portions of the wxWidgets API, enabling Python -applications to have a GUI on Windows, macOS or Unix-like systems, -with a native look and feel and requiring very little (if any) -platform specific code. - -%package -n python-wxPython-lang -# We cannot use %%lang_package here. Editra translations use noarch incompatible path. -Summary: Languages for package %{pprefix}-wxPython -Group: System/Libraries -Requires: python-wxPython = %{version} -Requires: %{plainpython}(abi) = %python_version -Supplements: (bundle-lang-other and python-wxPython) -Provides: python-wxPython-lang-all = %{version} - -%description -n python-wxPython-lang -Provides translations to the package %pprefix-wxPython. - %prep %autosetup -n wxPython-%{version} -p1 @@ -203,15 +184,12 @@ echo "# empty module" >> wx/lib/pubsub/core/itopicdefnprovider.py %build export CFLAGS="%{optflags}" export DOXYGEN=%{_bindir}/doxygen -%python_expand $python build.py build %{wx_args} +%python_exec build.py build %{wx_args} %install -%python_expand $python build.py install %{wx_args} --destdir=%{buildroot} --extra_setup="-O1 --force" -# build.py install helpfully installs built shared libraries for all versions, -# so remove those for other versions. -%{python_expand find %{buildroot}%{$python_sitearch} -name *.so ! -name *cpython-%{$python_version_nodots}*so -delete} +%python_exec build.py install %{wx_args} --destdir=%{buildroot} --extra_setup="-O1 --force" -%python_expand %fdupes %{buildroot}%{$python_sitearch} +%fdupes %{buildroot}%{_libdir} %python_clone -a %{buildroot}%{_bindir}/helpviewer %python_clone -a %{buildroot}%{_bindir}/img2png @@ -226,20 +204,7 @@ export DOXYGEN=%{_bindir}/doxygen %python_clone -a %{buildroot}%{_bindir}/wxdocs %python_clone -a %{buildroot}%{_bindir}/wxget -# Note: find_lang only works for one python flavor per multibuild, -# cannot use python_find_lang in python_subpackage_only mode. %find_lang wxstd -%{python_expand # -echo "%%dir %{$python_sitearch}/wx/locale/ -%%dir %{$python_sitearch}/wx/locale/* -%%dir %{$python_sitearch}/wx/locale/*/LC_MESSAGES" >> wxstd.lang -} -%if "%psuffix" == "-other" -if [ $(echo %pythons | wc -w) -gt 1 ]; then - # could not collect for only one flavor, package locale files unmarked - echo "" > wxstd.lang -fi -%endif %check %if %{with test} @@ -266,22 +231,13 @@ mv wx wx_temp mv wx_temp wx %endif -%if 0%{?python_subpackage_only} -%post -n python-wxPython -%{python_install_alternative pywxrc helpviewer img2png img2py img2xpm pycrust pyshell pyslices pyslicesshell wxdemo wxdocs wxget} - -%postun -n python-wxPython -%{python_uninstall_alternative pywxrc} -%else - %post -%{python_install_alternative pywxrc helpviewer img2png img2py img2xpm pycrust pyshell pyslices pyslicesshell wxdemo wxdocs wxget} +%python_install_alternative pywxrc helpviewer img2png img2py img2xpm pycrust pyshell pyslices pyslicesshell wxdemo wxdocs wxget %postun -%{python_uninstall_alternative pywxrc} -%endif +%python_uninstall_alternative pywxrc -%files %{python_files wxPython} +%files %license LICENSE.txt license/*.txt %doc CHANGES.rst README.rst TODO.rst %python_alternative %{_bindir}/helpviewer @@ -300,9 +256,9 @@ mv wx_temp wx %{python_sitearch}/wx/ %exclude %{python_sitearch}/wx/locale/ -%files %{python_files wxPython-lang} -f wxstd.lang -%if "%psuffix" == "-other" -%{python_sitearch}/wx/locale/ -%endif +%files lang -f wxstd.lang +%dir %{python_sitearch}/wx/locale/ +%dir %{python_sitearch}/wx/locale/* +%dir %{python_sitearch}/wx/locale/*/LC_MESSAGES %changelog