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 での作業はありません。なんで?すなわち:

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

2 に答える 2

0

うーん...、私が言えるのは、Ubuntu12.04でコードを使用したときにコードで経験したことだけです。

1)私の写真が表示されない(つまり、灰色のウィンドウはもう表示されない)

2)EVT_ENTER / LEAVE_WINDOWをimage1ではなくselfにバインドする場合(以下を参照)、機能します

# 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を1回使用しようとしたことを覚えています。同じメソッドを使用すると、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 に答える
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 に答える