wxPython-SetBitmap导致重新定位和双倍图像

时间:2019-05-23 09:59:40

标签: python python-3.x image wxpython

当鼠标悬停在小部件上方时,我想更新wx.StaticBitmap的图片。 Baiscally,切换到黑白进行测试。

我的问题是,当调用self.image.SetBitmap(...)时,图像将重新放置在我的窗口中,并且旧的图像仍停留在旧的位置。

另一个问题:是否可以在不加载新的黑白图像的情况下使我的图像黑白化?

这是我的代码:

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 个答案:

答案 0 :(得分:1)

使用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)

文档:wx.Image