2009-09-12 67 views
4

我想在StaticBitmap上創建懸停效果 - 如果鼠標光標位於位圖上,則顯示一個圖像,如果不是,則顯示第二個圖像。這是一個微不足道的程序(與一個按鈕完美配合)。但是,StaticBitmap不會發出EVT_WINDOW_ENTER,EVT_WINDOW_LEAVE事件。如何在wxpython的StaticBitmap上創建懸停效果?

我可以使用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() 

回答

1

看起來這是一個錯誤wxGTK,進入和離開事件的窗口正常工作。你應該引導核心開發人員注意這個問題,一個好的地方是他們的bug tracker。這是一個你不應該依靠恕我直言的問題。

我發現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() 
0

有可能是錯誤的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()