如何在wxpython中的StaticBitmap上创建悬停效果?

如何在wxpython中的StaticBitmap上创建悬停效果?,python,image,wxpython,wxwidgets,hover,Python,Image,Wxpython,Wxwidgets,Hover,我想在StaticBitmap上创建悬停效果-如果鼠标光标位于位图上方,则显示一个图像,否则显示第二个图像。这是一个很简单的程序(只需一个按钮就可以很好地工作)。但是,StaticBitmap不会发出EVT\u WINDOW\u ENTER、EVT\u WINDOW\u LEAVE事件 我可以使用EVT_运动。如果光标位于图像边缘时切换图像,则切换有时不起作用。(主要是在边缘上快速移动) 示例代码: #!/usr/bin/python # -*- coding: utf-8 -*- impor

我想在StaticBitmap上创建悬停效果-如果鼠标光标位于位图上方,则显示一个图像,否则显示第二个图像。这是一个很简单的程序(只需一个按钮就可以很好地工作)。但是,StaticBitmap不会发出EVT\u WINDOW\u ENTER、EVT\u WINDOW\u LEAVE事件

我可以使用EVT_运动。如果光标位于图像边缘时切换图像,则切换有时不起作用。(主要是在边缘上快速移动)

示例代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx

def onWindow(event):
    print "window event:", event.m_x, event.m_y

def onMotion(event):
    print "motion event:", event.m_x, event.m_y

app = wx.App()

imageA = wx.Image("b.gif", wx.BITMAP_TYPE_ANY).ConvertToBitmap()
imageB = wx.Image("a.gif", wx.BITMAP_TYPE_ANY).ConvertToBitmap()

frame = wx.Frame(None, wx.ID_ANY, title="Hover effect", size=(100+imageA.GetWidth(), 100+imageA.GetHeight()))

w = wx.Window(frame)
bmp = wx.StaticBitmap(w, -1, imageA, (50, 50), (imageA.GetWidth(), imageA.GetHeight()))
bmp.Bind(wx.EVT_MOTION, onMotion) 
bmp.Bind(wx.EVT_ENTER_WINDOW, onWindow)
bmp.Bind(wx.EVT_LEAVE_WINDOW, onWindow)

frame.Show()
app.MainLoop()

看起来这是一个wxGTK错误,输入和离开事件在windows上可以正常工作。您应该将核心开发人员的注意力引导到这个问题上,一个好的地方是他们的团队。这是一个你不应该绕过IMHO的问题

我发现在wxGTK上GenericButtons没有这个问题,所以在StaticBitmap得到修复之前,您可以使用它

#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx
from wx.lib import buttons

def onWindow(event):
    print "window event:", event.m_x, event.m_y

def onMotion(event):
    print "motion event:", event.m_x, event.m_y

app = wx.App()

imageA = wx.Image("b.gif", wx.BITMAP_TYPE_ANY).ConvertToBitmap()
imageB = wx.Image("a.gif", wx.BITMAP_TYPE_ANY).ConvertToBitmap()

frame = wx.Frame(None, wx.ID_ANY, title="Hover effect", size=(100+imageA.GetWidth(), 100+imageA.GetHeight()))

w = wx.Window(frame)
#bmp = wx.StaticBitmap(w, -1, imageA, (50, 50), (imageA.GetWidth(), imageA.GetHeight()))
bmp = buttons.GenBitmapButton(w, -1, imageA, style=wx.BORDER_NONE)
#bmp.Bind(wx.EVT_MOTION, onMotion)
bmp.Bind(wx.EVT_ENTER_WINDOW, onWindow)
bmp.Bind(wx.EVT_LEAVE_WINDOW, onWindow)

frame.Show()
app.MainLoop()

wxStaticBitmap实现中可能存在bug,但如果wxBitmapButton正常工作,您可以使用它实现相同的效果,代码更少

#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx

app = wx.App()

frame = wx.Frame(None, wx.ID_ANY, title="Hover effect")
w = wx.Window(frame)
c = wx.BitmapButton(w, -1, wx.EmptyBitmap(25,25), style = wx.NO_BORDER)
c.SetBitmapHover(wx.EmptyBitmap(3,3))
frame.Show()

app.MainLoop()