2013-02-18 52 views
2

我想提供一個自定義按鈕類,需要懸停才能正常工作。因此我使用了StaticBitmap並對其進行了擴展。但是我發現Windows和Linux之間使用相同的確切代碼之間的差異。下面的小例子在Linux中不能正常工作,但在Windows中正常工作:wxPython鼠標輸入/離開事件方法在Linux上不起作用

import wx 
class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Test") 
     panel = wx.Panel(self, wx.ID_ANY, size=(200,100)) 
     panel.SetBackgroundColour("Black") 

     # create a normal bitmap button 
     bitmap = wx.Bitmap("images/power.png", wx.BITMAP_TYPE_ANY) 
     self.image1 = wx.StaticBitmap(panel, bitmap=bitmap, size=bitmap.GetSize()) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.image1) 
     panel.SetSizer(sizer) 

     # This works on Windows, but not on Linux 
     #self.image1.Bind(wx.EVT_ENTER_WINDOW, self.OnHover) 
     #self.image1.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveHover) 

     # This (used by itself) gets events for both Linux/Win, but 
     # doesn't find e.Entering() or e.Leaving() on Linux! 
     self.image1.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouseEvents) 

    def OnHover(self, e): 
     print "Hover" 

    def OnLeaveHover(self,e): 
     print "Leaving Hover" 

    def OnMouseEvents(self,e): 
     print "Mouse event" 
     #print dir(e) 
     if e.Entering(): 
      print "Hover" 
     elif e.Leaving(): 
      print "Leaving Hover" 
     else: 
      e.Skip() 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

這是已知問題嗎?有沒有其他的方式來綁定事件,讓鼠標懸停/懸停操作在Linux中正常工作?

此外,沒有任何形式的self.Bind()在Linux或Windows上工作。爲什麼?即:

self.Bind(wx.EVT_ENTER_WINDOW, self.OnHover, self.image1) 
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveHover, self.image1) 
+0

約self.Bind第二個問題()不工作的Linux或Windows中「的wxPython在行動」一書進行了說明。輸入/離開事件不能綁定到框架。所以從頭開始。更大的問題是爲什麼Entering()/ Leaving()在Linux上不起作用。 – 2013-02-18 05:06:04

回答

0

嗯...,我能告訴你的是什麼,我經歷了你的代碼在Ubuntu使用時12.04

1)我的圖片一直沒有出現(即一個灰色的窗口,僅此而已)

2)結合EVT_ENTER/LEAVE_WINDOW自我的時候,而不是圖像1(見下文),它的工作原理

# This now works on Linux 
    #self.Bind(wx.EVT_ENTER_WINDOW, self.OnHover) 
    #self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveHover) 

我希望這有助於你以某種形式。另外我想補充一點,不幸的是,我對wxpython的跨平臺兼容性做了許多糟糕的體驗。我非常喜歡這個庫,但是一旦它深入到更加模糊的小部件中,Windows和Linux之間的行爲可能會大不相同。

我記得一次嘗試使用MPlayerCtrl和在Windows中使用相同的方法它將返回0,而在Linux中它將返回-1(不能介意到底是哪種方法,一旦我注意到該項目被拋棄)

也許,這是那些奇怪的行爲又一個...


已經想過這個問題更多一些。

而不是將事件綁定到圖片,您可以將它綁定到它所顯示的小部件,例如面板。

self.panel = wx.Panel(self, wx.ID_ANY, size=(200,100)) 
    self.panel.SetBackgroundColour("Black") 

    ... 

    #self.panel.Bind(wx.EVT_ENTER_WINDOW, self.OnHover) 
    #self.pane.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveHover) 
+0

嗯,改變綁定到面板或框架使得鼠標一進入鼠標就會觸發事件,但是當鼠標進入圖像時我正在尋找它的事件。 – 2013-02-25 07:52:21

+0

如果你離開了wxPython,你去了哪裏?我正在尋找一個經過驗證的開源跨平臺GUI。謝謝。 – 2013-02-25 07:54:25

+0

@David Lynch:對不起,回覆晚了。 FWIW,在這裏檢查http://stackoverflow.com/questions/1415727/how-to-create-hover-effect-on-staticbitmap-in-wxpython它似乎是一個「仍然」不固定的錯誤。 – Nebelhom 2013-03-07 13:33:47

0

你應該wx.EVT_ENTER_WINDOW/wx.EVT_LEAVE_WINDOW事件綁定到self.panel。這樣可行。

wx.EVT_ENTER_WINDOW/wx.EVT_LEAVE_WINDOW wx.CommandEvent類的子類。它不會被拋到父窗口來處理。