1

私が達成したいことの小さな例を作ることができました。緑色のパネルをダブルクリックすると消えてしまい、赤色のパネルをダブルクリックすると緑色のパネルが再び表示されますが、これも問題ありません。私が問題を抱えているのは、赤いパネルが表示されていないときに緑のパネルを上に移動して赤のパネルの代わりにし、緑のパネルを削除して赤のパネルが表示されたときの状態に戻す方法です。変更する必要はありませんグリッドサイザーでのそれらの位置。

誰か助けてくれませんか?

以下は、これを達成しようとしているテンプレートコードです。

import wx
class myframe(wx.Frame):
    def __init__(self):
        "Constructor. No arguments"
        wx.Frame.__init__(self, None, size=(2000,2000))
        self.myPanel1 = wx.Panel( self, size=(300, 300) )
        myPanel2 = wx.Panel( self, size=(300, 300) )

        self.myPanel1.SetBackgroundColour("green")
        myPanel2.SetBackgroundColour("red")
        myGridSizer = wx.GridBagSizer()
        myGridSizer.Add(self.myPanel1, pos=(0, 0), span=(1,1), flag=wx.EXPAND)
        myGridSizer.Add(myPanel2, pos=(1, 0), span=(1,1), flag=wx.EXPAND)
        self.SetSizer(myGridSizer)
        self.myPanel1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe)
        myPanel2.Bind(wx.EVT_LEFT_DCLICK, self.showMe)

    def hideMe(self, event):
        print "hide!"
        self.myPanel1.Hide()

    def showMe(self, event):
        print "show!"
        self.myPanel1.Show()

if __name__ == "__main__":
    print "Running Demo"
    app = wx.App()
    region = myframe()
    region.Show()
    app.MainLoop()
4

2 に答える 2

1

技術的には、ウィジェットを実際に移動しないと、この方法で機能させることはできません。Yoriz の例では、緑のパネルがあった場所に赤のパネルがほとんど配置されていますが、フレームの上部から赤のパネルを分離する灰色のストリップがあることに気付くでしょう。これは、グリッドサイザーがまだ非表示のグリーン パネル用のスペースを確保しているためです。

シームレスにしたい場合は、サイザーの Detach() およびさまざまな Insert() メソッドを参照してください: http://wxpython.org/docs/api/wx.Sizer-class.html

于 2013-06-13T18:52:42.990 に答える
0

Hide と Show を呼び出した後、self.Layout() を呼び出します。上部のギャップを取り除くために「myGridSizer.SetEmptyCellSize((0, 0))」を追加しました。

import wx
class myframe(wx.Frame):
    def __init__(self):
        "Constructor. No arguments"
        wx.Frame.__init__(self, None, size=(2000,2000))
        self.myPanel1 = wx.Panel( self, size=(300, 300) )
        myPanel2 = wx.Panel( self, size=(300, 300) )

        self.myPanel1.SetBackgroundColour("green")
        myPanel2.SetBackgroundColour("red")
        myGridSizer = wx.GridBagSizer()
        myGridSizer.Add(self.myPanel1, pos=(0, 0), span=(1,1), flag=wx.EXPAND)
        myGridSizer.Add(myPanel2, pos=(1, 0), span=(1,1), flag=wx.EXPAND)
        self.SetSizer(myGridSizer)
        self.myPanel1.Bind(wx.EVT_LEFT_DCLICK, self.hideMe)
        myPanel2.Bind(wx.EVT_LEFT_DCLICK, self.showMe)
        myGridSizer.SetEmptyCellSize((0, 0))

    def hideMe(self, event):
        print "hide!"
        self.myPanel1.Hide()
        self.Layout()

    def showMe(self, event):
        print "show!"
        self.myPanel1.Show()
        self.Layout()

if __name__ == "__main__":
    print "Running Demo"
    app = wx.App()
    region = myframe()
    region.Show()
    app.MainLoop()
于 2013-06-13T18:15:32.433 に答える