Como criar pairar efeito sobre StaticBitmap em wxpython?
Pergunta
Eu quero criar pairar efeito sobre StaticBitmap - Se o cursor do mouse está sobre o bitmap, mostra uma imagem, se não, mostra segunda imagem. É programa trivial (funciona perfeitamente com um botão). EVT_WINDOW_ENTER No entanto, StaticBitmap não emite, eventos EVT_WINDOW_LEAVE.
Eu posso trabalhar com EVT_MOTION. Se as imagens são trocados quando o cursor está na borda da imagem, mudar às vezes não funciona. (Principalmente com movimento rápido sobre a borda).
código Exemplo:
#!/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()
Solução
Parece que este é um bug wxGTK, ENTER e multa eventos deixar o trabalho em janelas. Você deve direcionar a atenção dos desenvolvedores do núcleo para o problema, um bom lugar para fazer isso é a sua bug rastreador . Este é um problema que você não deveria ter que trabalhar em torno IMHO.
Eu descobri que GenericButtons não tem esse problema em wxGTK, então talvez você pode usar que até StaticBitmap fica fixo.
#!/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()
Outras dicas
Pode haver bug na implementação wxStaticBitmap, mas se wxBitmapButton funciona, você pode usá-lo para mesmo efeito, com menos código
#!/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()