Files
Phoenix/demo/Mask.py
Scott Talbert 173d079681 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
2021-12-01 14:19:00 -05:00

137 lines
4.0 KiB
Python

#!/usr/bin/env python
import wx
#----------------------------------------------------------------------
logicList = [
('wx.AND', wx.AND),
('wx.AND_INVERT', wx.AND_INVERT),
('wx.AND_REVERSE', wx.AND_REVERSE),
('wx.CLEAR', wx.CLEAR),
('wx.COPY', wx.COPY),
('wx.EQUIV', wx.EQUIV),
('wx.INVERT', wx.INVERT),
('wx.NAND', wx.NAND),
('wx.NO_OP', wx.NO_OP),
('wx.OR', wx.OR),
('wx.OR_INVERT', wx.OR_INVERT),
('wx.OR_REVERSE', wx.OR_REVERSE),
('wx.SET', wx.SET),
('wx.SRC_INVERT', wx.SRC_INVERT),
('wx.XOR', wx.XOR),
]
if 'wxMac' in wx.PlatformInfo:
# that's all, folks!
logicList = [
('wx.COPY', wx.COPY),
('wx.XOR', wx.XOR),
]
import images
class TestMaskWindow(wx.ScrolledWindow):
def __init__(self, parent):
wx.ScrolledWindow.__init__(self, parent, -1)
self.SetBackgroundColour(wx.Colour(0,128,0))
# A reference bitmap that we won't mask
self.bmp_nomask = images.TestStar2.GetBitmap()
# One that we will
self.bmp_withmask = images.TestStar2.GetBitmap()
# This mask comes from a monochrome bitmap
self.bmp_themask = images.TestMask.GetImage().ConvertToMonoBitmap(red=255, green=255, blue=255)
mask = wx.Mask(self.bmp_themask)
# Set the mask on our bitmap
self.bmp_withmask.SetMask(mask)
# Now we'll create a mask in a bit of an easier way, by picking a
# colour in the image that is to be the transparent colour.
self.bmp_withcolourmask = images.TestStar2.GetBitmap()
mask = wx.Mask(self.bmp_withcolourmask, wx.WHITE)
self.bmp_withcolourmask.SetMask(mask)
self.SetScrollbars(20, 20, 700//20, 460//20)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def OnPaint (self, e):
self.SetBackgroundColour(wx.Colour(0,128,0))
dc = wx.PaintDC(self)
self.PrepareDC(dc)
dc.SetTextForeground(wx.WHITE)
# Make an interesting background...
dc.SetPen(wx.MEDIUM_GREY_PEN)
for i in range(100):
dc.DrawLine(0,i*10, i*10,0)
# Draw raw image, mask, and masked images
dc.DrawText('original image', 0,0)
dc.DrawBitmap(self.bmp_nomask, 0,20, 0)
dc.DrawText('with colour mask', 0,100)
dc.DrawBitmap(self.bmp_withcolourmask, 0,120, 1)
dc.DrawText('the mask image', 0,200)
dc.DrawBitmap(self.bmp_themask, 0,220, 0)
dc.DrawText('masked image', 0,300)
dc.DrawBitmap(self.bmp_withmask, 0,320, 1)
cx,cy = self.bmp_themask.GetWidth(), self.bmp_themask.GetHeight()
# Draw array of assorted blit operations
mdc = wx.MemoryDC()
i = 0
for text, code in logicList:
x,y = 120+150*(i%4), 20+100*(i/4)
dc.DrawText(text, x, int(y-20))
mdc.SelectObject(self.bmp_withcolourmask)
dc.Blit(x,int(y), cx,cy, mdc, 0,0, code, True)
i = i + 1
# On wxGTK there needs to be a panel under wx.ScrolledWindows if they are
# going to be in a wxNotebook...
class TestPanel(wx.Panel):
def __init__(self, parent, ID):
wx.Panel.__init__(self, parent, ID)
self.win = TestMaskWindow(self)
self.Bind(wx.EVT_SIZE, self.OnSize)
def OnSize(self, evt):
self.win.SetSize(evt.GetSize())
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, -1)
return win
#----------------------------------------------------------------------
overview = """\
This class encapsulates a monochrome mask bitmap, where the masked area is black
and the unmasked area is white. When associated with a bitmap and drawn in a device
context, the unmasked area of the bitmap will be drawn, and the masked area will
not be drawn.
This example shows not only how to create a Mask, but the effects of the Device
Context (dc) <code>Blit()</code> method's logic codes.
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])