Следующий код с использованием wxpython 4.0.4 правильно отображает прозрачность png в MacOs High Sierra, что приводит к следующему:
Однако, когда я запускаютот же код на Windows 764bit, я получаю этот результат, который игнорирует прозрачность:
Мой вопрос: почему это происходит и как я могуполучить тот же вывод на Windows, как на Mac?
Я знаю, что мог бы просто нарисовать фоновое растровое изображение и любые растровые растровые изображения переднего плана в обработчике onpaint и использовать что-то вроде wx.GraphicsContext, чтобы попытаться обработать это вручную, но почему я не могу сделать то, что я здесь,Я хочу нарисовать фон в обработчике wx.EVT_ERASE_BACKGROUND (или каком-либо другом обработчике?), Но я хочу создать объекты wx.Bitmap или wx.StaticBitmap для tucan (и, возможно, несколько других наложенных изображений).Как мне этого добиться?Он отлично работает на MacOS, не должен ли быть способ заставить его работать на Windows?
Если это так, пожалуйста, сообщите.
Примечание. Код автоматически загружает нужные ему изображения исохраняет их во временной папке.
# Note: programmed with Python 3.6.7 and wxpython 4.0.4
# pip install wxpython
from pathlib import Path
import wx
class DemoFrame(wx.Frame):
def __init__(self, parent, title:str, fg_image:Path, bg_image:Path):
super(DemoFrame, self).__init__(parent, title=title, size=(640, 480))
self.fg_image = fg_image
self.bg_image = bg_image
self.fg_bitmap = wx.Bitmap()
self.bg_bitmap = wx.Bitmap()
self.panel = None
self.InitUI()
self.Centre()
def InitUI(self):
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour(wx.BLACK)
self.bg_bitmap = wx.Bitmap(str(self.bg_image.resolve()))
self.fg_bitmap = wx.Bitmap(str(self.fg_image.resolve()))
wx.StaticBitmap(parent=self, id=wx.ID_ANY, bitmap=self.fg_bitmap,
pos=wx.Point(275, 125))
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
def OnEraseBackground(self, evt):
"""Add a picture to the background (from ColourDB.py)"""
dc = evt.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
dc.DrawBitmap(self.bg_bitmap, 0, 0)
if __name__ == '__main__':
import urllib.request
import tempfile
tmp_dir = tempfile.mkdtemp()
fg_url = "https://i.imgur.com/B5fg2dp.png"
fg_path = Path(tmp_dir, Path(fg_url).name)
urllib.request.urlretrieve(fg_url, fg_path)
bg_url = "https://i.imgur.com/rCPzBMr.png"
bg_path = Path(tmp_dir, Path(bg_url).name)
urllib.request.urlretrieve(bg_url, bg_path)
app = wx.App()
ex = DemoFrame(None, title='Bitmap Alpha Demo',
fg_image=fg_path, bg_image=bg_path).Show()
app.MainLoop()