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()
Foi útil?

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top