Events wxPython鼠标进入/离开事件方法don';我不能在Linux上工作

Events wxPython鼠标进入/离开事件方法don';我不能在Linux上工作,events,wxpython,mouse,bind,Events,Wxpython,Mouse,Bind,我试图提供一个自定义按钮类,它需要一个鼠标悬停才能正常工作。因此,我使用静态位图并扩展它。但我发现Windows和Linux之间的区别在于两者使用了相同的代码。以下简单的小示例在Linux中无法正常工作,但在Windows中可以正常工作: import wx class MyForm(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, "Test") panel

我试图提供一个自定义按钮类,它需要一个鼠标悬停才能正常工作。因此,我使用静态位图并扩展它。但我发现Windows和Linux之间的区别在于两者使用了相同的代码。以下简单的小示例在Linux中无法正常工作,但在Windows中可以正常工作:

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()
这是一个已知的问题吗?是否有其他方法绑定事件以使mouseover/hover操作在Linux中正常工作

此外,这里没有任何形式的
self.Bind()
可以在Linux或Windows上使用。为什么?i、 e:

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

嗯…,我能告诉你的就是我在Ubuntu 12.04中使用你的代码时的感受

1) 我的照片从来没有出现过(即灰色的窗口,仅此而已)

2) 将EVT_进入/离开_窗口绑定到self而不是image1(见下文)时,它可以工作

# 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)

您应该将wx.EVT\u ENTER\u WINDOW/wx.EVT\u LEAVE\u WINDOW事件绑定到self.panel。这很有效


wx.EVT\u ENTER\u WINDOW/wx.EVT\u LEAVE\u WINDOW是wx.CommandEvent类的子类。它不会被抛出到父窗口来处理。

关于self.Bind()不适用于Linux或Windows的第二个问题在“wxPython in Action”一书中进行了解释。无法将输入/离开事件绑定到帧。所以,把它擦掉。更大的问题是为什么Entering()/Leaving()在Linux上不起作用。好吧,更改为绑定到面板或框架会使事件在鼠标进入面板或框架时立即触发,但我所寻找的是当鼠标进入图像时触发的事件。如果您离开wxPython,您去了哪里?我正在寻找一个经过验证的开源跨平台GUI。谢谢。@David Lynch:很抱歉回复晚了。FWIW,检查这里,似乎是一个“仍然”未修复的bug。@David Lynch:关于你的第二个问题。我最近没有做太多GUI的东西。我尝试了GTK+3,但我认为目前只适用于Linux(不确定)。当然,还有一些常见的嫌疑犯,比如PyQt、pyGTK、Tkinter等()。人们已经推荐了PyQt,但我不能发表评论,因为它背后有一家公司,许可证可能是个问题。老实说,我自己也没有找到令人满意的答案。无论你做什么,这似乎总是一种权衡。对不起,我不能给你一个更具体的答案。只要坚持一个就行了。