【问题标题】:wxPython Mouse Entering/Leaving event methods don't work on LinuxwxPython 鼠标进入/离开事件方法在 Linux 上不起作用
【发布时间】:2013-02-18 04:57:49
【问题描述】:

我正在尝试提供一个需要悬停才能正常工作的自定义按钮类。因此,我正在使用 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 上工作。为什么?即:

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

【问题讨论】:

  • 关于 self.Bind() 不适用于 Linux 或 Windows 的第二个问题在“wxPython in Action”一书中进行了解释。进入/离开事件不能绑定到框架。所以刮一下。更大的问题是为什么 Entering()/Leaving() 在 Linux 上不起作用。

标签: events wxpython mouse bind


【解决方案1】:

嗯...,我只能告诉您在 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)

【讨论】:

  • 好吧,更改为绑定到面板或框架会使事件在鼠标进入它们时立即触发,但我正在寻找它是在鼠标进入图像时触发的事件。跨度>
  • 如果你离开了wxPython,你去哪儿了?我正在寻找一个经过验证的开源跨平台 GUI。谢谢。
  • @David Lynch:抱歉回复晚了。 FWIW,在这里检查stackoverflow.com/questions/1415727/… 这似乎是一个“仍然”没有修复的错误。
  • @David Lynch:关于你的第二个问题。我最近没有做太多 GUI 的东西。我在 GTK+3 上尝试过,但我认为目前仅适用于 Linux(不确定)。当然,还有常见的嫌疑人,如 PyQt、pyGTK、Tkinter 等 (docs.python.org/2/faq/gui)。人们推荐了 PyQt,但我无法发表评论,因为它背后有一家公司,许可证可能是个问题。老实说,我自己还没有找到满意的答案。无论您做什么,似乎总是需要权衡取舍。对不起,我不能给你更具体的答案。选择一个并坚持下去。
【解决方案2】:

您应该将 wx.EVT_ENTER_WINDOW/wx.EVT_LEAVE_WINDOW 事件绑定到 self.panel。行得通。

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

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多