0

親ウィンドウにドッキングしてそれをたどる単純なドッキングフレームを作成しようとしています。これまでのところ、次のものがあります。

class DockingFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, style=wx.CAPTION)

        parent.Bind(wx.EVT_MOVE, self.OnParentMove)
        parent.Bind(wx.EVT_ACTIVATE, self.OnParentActivate)
        parent.Bind(wx.EVT_SHOW, self.OnParentShow)

    def OnParentMove(self, moveEvent):
        print "Docked frame parent moved"
        pr = positioning.position(
            self.Rect,
            my='right_top', at='left_top', of=self.Parent.Rect)
        self.Move(pr.top_left)
        moveEvent.Skip()

    def OnParentActivate(self, event):
        print "Docked frame parent activated"
        self.Raise()
        event.Skip()

    def OnParentShow(self, event):
        print "Docked frame parent showed"
        self.Show(event.GetShow())
        event.Skip()

class MainFrame(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, title=title)

        self.info_frame = DockingFrame(self)

        self.Show(True)

これは、親ウィンドウを移動すると、ドッキングされたウィンドウが一緒に移動し、親ウィンドウをクリックすると、ドッキングされたウィンドウが立ち上がるという点で機能します。ただし、親ウィンドウの機能を著しく妨げます。親ウィンドウを閉じたりサイズを変更したりすることはできなくなり、親をクリックするたびに「ドッキングされたフレームの親がアクティブになりました」というメッセージが大量に表示されます。ここで、wxPython の基本的な概念を理解していないようです。何が起こっていて、どうすれば修正できますか?

ドッキングをサポートしているように見えauiますが、ドキュメントがまばらなので試していません。を使用して別のFrameドックを作成する方法について、最小限の作業コード サンプルを誰かが提供できれば、私もそのアプローチを取ることができます。Frameaui

pygameこのアプリではandも使用していることに注意してくださいtwisted。これは、ここで干渉している場合と干渉していない場合があります...

4

2 に答える 2

2

そしてもちろん、単純なアプローチは単純にwx.FRAME_FLOAT_ON_PARENTスタイルを使用することです...

class DockingFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title="Last Hand",
                          style=wx.CAPTION  | wx.FRAME_FLOAT_ON_PARENT)

        parent.Bind(wx.EVT_MOVE, self.OnParentMove)
        parent.Bind(wx.EVT_SHOW, self.OnParentShow)

    def SnapToParent(self):
        print "*Snapping to parent"
        pr = positioning.position(
            self.Rect,
            my='right_top', at='left_top', of=self.Parent.Rect)
        self.Move(pr.top_left)

    def OnParentMove(self, moveEvent):
        moveEvent.Skip()
        self.SnapToParent()

    def OnParentShow(self, event):
        event.Skip()
        print "Parent %s" % ("Hide", "Show")[event.GetShow()]
        self.Show(event.GetShow())
于 2013-03-18T23:15:22.380 に答える
0

トリックは、EVT_ACTIVATEアクティブ化と非アクティブ化の両方で発火することでした。次のコードは機能しました。親がアクティブ化されると、ドックはそれ自体を上げ、その後すぐに親を上げます。

class DockingFrame(wx.Frame):
    def __init__(self, parent):
        self.handleParentActiveState = 'noTriggers'

        wx.Frame.__init__(self, parent, title="Last Hand", style=wx.CAPTION)

        parent.Bind(wx.EVT_MOVE, self.OnParentMove)
        parent.Bind(wx.EVT_ACTIVATE, self.OnParentActivate)
        self.Bind(wx.EVT_ACTIVATE, self.OnActivate)
        parent.Bind(wx.EVT_SHOW, self.OnParentShow)        

    def OnActivate(self, event):
        event.Skip()
        if not event.GetActive():
            return

        if self.handleParentActiveState == 'activateParentNext':
            self.handleParentActiveState = 'resetTriggers'
            self.Parent.Raise()

    def OnParentActivate(self, event):
        event.Skip()
        if not event.GetActive():
            return

        if self.handleParentActiveState == 'noTriggers':
            self.handleParentActiveState = 'activateParentNext'
            self.Raise()
        elif self.handleParentActiveState == 'resetTriggers':
            self.handleParentActiveState = 'noTriggers'

    def OnParentMove(self, moveEvent):
        pr = positioning.position(
            self.Rect,
            my='right_top', at='left_top', of=self.Parent.Rect)
        self.Move(pr.top_left)
        moveEvent.Skip()

    def OnParentShow(self, event):
        event.Skip()
        self.Show(event.GetShow())
于 2013-03-18T22:57:08.520 に答える