Почему прозрачность растровых изображений wxpython не работает одинаково на Mac и Windows? - PullRequest
0 голосов
/ 17 апреля 2019

Следующий код с использованием wxpython 4.0.4 правильно отображает прозрачность png в MacOs High Sierra, что приводит к следующему:

enter image description here

Однако, когда я запускаютот же код на Windows 764bit, я получаю этот результат, который игнорирует прозрачность:

enter image description here

Мой вопрос: почему это происходит и как я могуполучить тот же вывод на 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()
...