wxPython - SetBitmap приводит к перепозиционированию и двойному изображению - PullRequest
0 голосов
/ 23 мая 2019

Я хочу обновить изображение моего wx.StaticBitmap, когда мышь находится над виджетом. По выбору переключитесь на черно-белое для тестирования.

Моя проблема в том, что когда вызывается self.image.SetBitmap(...), изображение перемещается в моем окне, а также старое остается на старой позиции.

Дополнительный вопрос: возможно ли сделать мое изображение черно-белым без загрузки нового изображения BW?

Вот мой код:

import wx

class Example(wx.Frame):
    def __init__(self, *args, **kw):
        super(Example, self).__init__(*args, **kw)
        self.InitUI()

    def InitUI(self):
        self.panel = wx.Panel(self)
        hbox = wx.BoxSizer(wx.HORIZONTAL)

        self.png = wx.Bitmap("TestButton.png")
        self.png_bw = wx.Bitmap("TestButton_bw.png")

        self.image = wx.StaticBitmap(self.panel, 1, self.png)

        self.image.Bind(wx.EVT_ENTER_WINDOW, self.OnOver)
        self.image.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)

        hbox.Add(self.image,1)        

        self.panel.SetSizer(hbox)

        self.SetTitle('Button Test')
        self.Centre()

    def OnOver(self, event):
        self.image.SetBitmap(self.png_bw)
    def OnLeave(self, event):
        self.image.SetBitmap(self.png)

def main():
    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

1 Ответ

1 голос
/ 23 мая 2019

Используйте self.panel.Layout(), чтобы заставить его упорядочить предметы

def OnOver(self, event):
    self.image.SetBitmap(self.png_bw)
    self.panel.Layout()

def OnLeave(self, event):
    self.image.SetBitmap(self.png)
    self.panel.Layout()

В Linux мне пришлось привязать события к self.panel вместо self.image

    self.panel.Bind(wx.EVT_ENTER_WINDOW, self.OnOver)
    self.panel.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)

Если self.image.Bind() работает в вашей системе, не меняйте его. Может быть, это только проблема в Linux.


Используя это, я могу поместить предмет в центр окна

    hbox.Add(self.image, 1, wx.EXPAND|wx.ALL)    

Используя wx.Image(), вы можете загрузить изображение, и у него есть методы для преобразования в оттенки серого.

    img = wx.Image("TestButton.png")
    img_bw = img.ConvertToGreyscale(0.3, 0.3, 0.3)

    self.png = wx.Bitmap(img)
    self.png_bw = wx.Bitmap(img_bw)

Док: шх. Изображение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...