Как создать эффект наведения на StaticBitmap в wxpython?
Вопрос
Я хочу создать эффект наведения на StaticBitmap - если курсор мыши находится над растровым изображением, показывает одно изображение, если нет, показывает второе изображение. Это тривиальная программа (отлично работает с кнопкой). Однако StaticBitmap не генерирует события EVT_WINDOW_ENTER, EVT_WINDOW_LEAVE.
Я могу работать с EVT_MOTION. Если изображения переключаются, когда курсор находится на краю изображения, переключение иногда не работает. (В основном с быстрым движением по краю).
Пример кода:
#!/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, события ENTER и LEAVE отлично работают на окнах. Вам следует обратить внимание разработчиков ядра на эту проблему. Хорошее место для этого - их средство отслеживания ошибок . , Это проблема, которую вы не должны обходить ИМХО.
Я обнаружил, что GenericButtons не имеют этой проблемы на wxGTK, поэтому, возможно, вы можете использовать ее, пока 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, но если 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()