12

私の前の質問で参照されているように、私は少し魔法使いのような機能を作ろうとしています。サイザーを追加した単一のフレームに落ち着きました。ユーザーに見てもらいたい画面ごとにパネルを作成し、それらをフレームのサイザーに追加してから、1 つのパネルを ing してパネルを切り替え、次のパネル.Hide()でカスタムを呼び出し.ShowYourself()ます。明らかに、ユーザーがプロセスを進めても、ボタンを同じ場所に残しておきたいと思います。

2 つのパネルを「戻る」ボタンと「次へ」ボタンで無限ループにリンクさせ、何が起こっているかを確認できるようにしました。最初のパネルは見栄えがします。tom10のコードはそのレベルで機能しました。国境があらゆる方向に飛んでいるという私の最初の派手な試みを避けたからです。そして、2番目のパネルは最小限に縮小されたようです. 最初のパネルに戻ると、ここでも収縮が発生しています。最初のパネルでは問題なく表示されるのに、そこに戻った後では表示されないのはなぜですか? .Fit()10 ピクセル x 10 ピクセルの灰色の塊が必要ないのに、なぜ呼び出しが必要なのですか? また、必要であれば、.Fit()一貫性のない結果が得られるのはなぜですか?

この無限ループは、これに関する私の経験を特徴付けているようです。パネルのレイアウトを修正しましたが、切り替えると他のパネルのレイアウトが台無しになることがわかりました。sizer_h.Add(self.panel1, 0)の代わりにを使用してこの問題を修正したsizer_h.Add(self.panel1, 1, wx.EXPAND)ところ、レイアウトが再びオフになりました。

これまでのところ、私の「解決策」は、mastersizer.SetMinSize((475, 592))各パネルのマスターサイザーに a を追加することです (以下のコードでコメントアウトされています)。これは厄介な解決策です。1) 試行錯誤によって機能する数値を見つけなければならなかった (幅が -5 ピクセル、高さが -28 ピクセル)。2) 根本的な問題がまだ発生する理由がわかりません。

正しい、醜くない解決策は何ですか? 一度にすべてのパネルをフレームのサイザーに追加する代わりに、フレームのサイザーからそのパネルを含むパネルを切り替え.Detach()てから、フレームのサイザー.Add()に次のパネルを ing する必要がありますか? .JustMakeThisFillThePanel()オンラインの wxWidgets ドキュメントと wxPython ドキュメントの両方で見逃したメソッドが隠されていますか?

私のメンタルモデルのレイアウトには明らかに何かが欠けています。以下に貼り付けた最小限のコード。

ここに画像の説明を入力

import wx
import sys


class My_App(wx.App):

    def OnInit(self):
        self.frame = My_Frame(None)
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True

    def OnExit(self):
        print 'Dying ...'


class My_Frame(wx.Frame):

    def __init__(self, image, parent=None,id=-1, title='Generic Title', pos=wx.DefaultPosition, style=wx.CAPTION | wx.STAY_ON_TOP):     

        size = (480, 620)
        wx.Frame.__init__(self, parent, id, 'Program Title', pos, size, style)

        sizer_h = wx.BoxSizer(wx.HORIZONTAL)

        self.panel0 = User_Interaction0(self)       
        sizer_h.Add(self.panel0, 1, wx.EXPAND)

        self.panel1 = User_Interaction1(self)       
        sizer_h.Add(self.panel1, 1, wx.EXPAND)

        self.SetSizer(sizer_h)

        self.panel0.ShowYourself()

    def ShutDown(self):
        self.Destroy()


class User_Interaction0(wx.Panel):

    def __init__(self, parent, id=-1):

        wx.Panel.__init__(self, parent, id)

        # master sizer for the whole panel
        mastersizer = wx.BoxSizer(wx.VERTICAL)
        #mastersizer.SetMinSize((475, 592))
        mastersizer.AddSpacer(15)


        # build the top row
        txtHeader = wx.StaticText(self, -1, 'Welcome to This Boring\nProgram', (0, 0))
        font = wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.BOLD)
        txtHeader.SetFont(font)
        txtOutOf = wx.StaticText(self, -1, '1 out of 7', (0, 0))                
        rowtopsizer = wx.BoxSizer(wx.HORIZONTAL)
        rowtopsizer.Add(txtHeader, 3, wx.ALIGN_LEFT) 
        rowtopsizer.Add((0,0), 1)  
        rowtopsizer.Add(txtOutOf, 0, wx.ALIGN_RIGHT) 
        mastersizer.Add(rowtopsizer, 0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15) 


        # build the middle row
        text = 'PANEL 0\n\n'
        text = text + 'This could be a giant blob of explanatory text.\n'

        txtBasic = wx.StaticText(self, -1, text)
        font = wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
        txtBasic.SetFont(font)
        mastersizer.Add(txtBasic, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)  


        # build the bottom row
        btnBack = wx.Button(self, -1, 'Back')
        self.Bind(wx.EVT_BUTTON, self.OnBack, id=btnBack.GetId())
        btnNext = wx.Button(self, -1, 'Next')
        self.Bind(wx.EVT_BUTTON, self.OnNext, id=btnNext.GetId())
        btnCancelExit = wx.Button(self, -1, 'Cancel and Exit')
        self.Bind(wx.EVT_BUTTON, self.OnCancelAndExit, id=btnCancelExit.GetId())
        rowbottomsizer = wx.BoxSizer(wx.HORIZONTAL)
        rowbottomsizer.Add(btnBack, 0, wx.ALIGN_LEFT)
        rowbottomsizer.AddSpacer(5)
        rowbottomsizer.Add(btnNext, 0)
        rowbottomsizer.AddSpacer(5)
        rowbottomsizer.AddStretchSpacer(1)
        rowbottomsizer.Add(btnCancelExit, 0, wx.ALIGN_RIGHT)
        mastersizer.Add(rowbottomsizer, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)

        # finish master sizer
        mastersizer.AddSpacer(15)   
        self.SetSizer(mastersizer)

        self.Raise()
        self.SetPosition((0,0))
        self.Fit()  
        self.Hide()


    def ShowYourself(self):
        self.Raise()
        self.SetPosition((0,0))
        self.Fit()
        self.Show()


    def OnBack(self, event):
        self.Hide()
        self.GetParent().panel1.ShowYourself()

    def OnNext(self, event):
        self.Hide()
        self.GetParent().panel1.ShowYourself()

    def OnCancelAndExit(self, event):
        self.GetParent().ShutDown()


class User_Interaction1(wx.Panel):

    def __init__(self, parent, id=-1):

        wx.Panel.__init__(self, parent, id)

        # master sizer for the whole panel
        mastersizer = wx.BoxSizer(wx.VERTICAL)
        #mastersizer.SetMinSize((475, 592))
        mastersizer.AddSpacer(15)


        # build the top row
        txtHeader = wx.StaticText(self, -1, 'Read about This Boring\nProgram', (0, 0))
        font = wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.BOLD)
        txtHeader.SetFont(font)
        txtOutOf = wx.StaticText(self, -1, '2 out of 7', (0, 0))                
        rowtopsizer = wx.BoxSizer(wx.HORIZONTAL)
        rowtopsizer.Add(txtHeader, 3, wx.ALIGN_LEFT) 
        rowtopsizer.Add((0,0), 1)  
        rowtopsizer.Add(txtOutOf, 0, wx.ALIGN_RIGHT) 
        mastersizer.Add(rowtopsizer, 0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15) 


        # build the middle row
        text = 'PANEL 1\n\n'
        text = text + 'This could be a giant blob of boring text.\n'

        txtBasic = wx.StaticText(self, -1, text)
        font = wx.Font(11, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
        txtBasic.SetFont(font)
        mastersizer.Add(txtBasic, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)  


        # build the bottom row
        btnBack = wx.Button(self, -1, 'Back')
        self.Bind(wx.EVT_BUTTON, self.OnBack, id=btnBack.GetId())
        btnNext = wx.Button(self, -1, 'Next')
        self.Bind(wx.EVT_BUTTON, self.OnNext, id=btnNext.GetId())
        btnCancelExit = wx.Button(self, -1, 'Cancel and Exit')
        self.Bind(wx.EVT_BUTTON, self.OnCancelAndExit, id=btnCancelExit.GetId())
        rowbottomsizer = wx.BoxSizer(wx.HORIZONTAL)
        rowbottomsizer.Add(btnBack, 0, wx.ALIGN_LEFT)
        rowbottomsizer.AddSpacer(5)
        rowbottomsizer.Add(btnNext, 0)
        rowbottomsizer.AddSpacer(5)
        rowbottomsizer.AddStretchSpacer(1)
        rowbottomsizer.Add(btnCancelExit, 0, wx.ALIGN_RIGHT)
        mastersizer.Add(rowbottomsizer, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=15)

        # finish master sizer
        mastersizer.AddSpacer(15)   
        self.SetSizer(mastersizer)

        self.Raise()
        self.SetPosition((0,0))
        self.Fit()  
        self.Hide()


    def ShowYourself(self):
        self.Raise()
        self.SetPosition((0,0))
        self.Fit()
        self.Show()


    def OnBack(self, event):
        self.Hide()
        self.GetParent().panel0.ShowYourself()

    def OnNext(self, event):
        self.Hide()
        self.GetParent().panel0.ShowYourself()

    def OnCancelAndExit(self, event):
        self.GetParent().ShutDown()


def main():
    app = My_App(redirect = False)
    app.MainLoop()


if __name__ == '__main__':
    main()
4

2 に答える 2

18

私はそれを理解したと思います。Showパネルのおよびメソッドを呼び出す代わりに、ルートサイザーのおよびメソッドHideを呼び出す必要があります。ShowHide

self.Show()

になる

self.GetParent().GetSizer().Show(self)

...等々。

また、各通話の後、

self.GetParent().GetSizer().Layout()
于 2010-04-01T21:49:49.437 に答える
4

ええ、私はこれがすでに答えられていることを知っていますが、とにかくここに行きます:

パネルの親で Layout() を呼び出すだけでよいので、self.GetParent().Layout() のようなものでうまくいくはずです。この記事を参照してください: http://www.blog.pythonlibrary.org/2010/06/16/wxpython-how-to-switch-between-panels/

ボタンを常に表示したい場合は、1 つの垂直サイザーで 2 つのパネルを作成します。上のパネルにはパネルが表示され、下のパネルにはボタンが表示されます。次に、PubSub などを使用してそれらの間で通信します。

于 2011-04-04T21:02:47.337 に答える