2

我正在尝试提供一个需要悬停才能正常工作的自定义按钮类。因此,我正在使用 StaticBitmap 并对其进行扩展。但是我发现 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()

这是一个已知的问题?是否有其他方法可以绑定事件以使鼠标悬停/悬停操作在 Linux 中正常工作?

此外,self.Bind()这里没有在 Linux 或 Windows 上工作的形式。为什么?IE:

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

2 回答 2

0

您应该将wx.EVT_ENTER_WINDOW/wx.EVT_LEAVE_WINDOW事件绑定到self.panel。这样可行。

wx.EVT_ENTER_WINDOW/wx.EVT_LEAVE_WINDOW不是wx.CommandEvent类的子类。它不会被扔到父窗口来处理。

于 2013-09-21T14:06:37.583 回答
0

嗯......,我只能告诉你我在 Ubuntu 12.04 中使用你的代码时的体验

1)我的图片永远不会出现(即灰色窗口仅此而已)

2)当将 EVT_ENTER/LEAVE_WINDOW 绑定到 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)
于 2013-02-23T12:23:21.467 回答