1

次のような 2 つの wxNotebook 要素を持つ GUI があります。

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                          "My App",size=(800,600),pos=((wx.DisplaySize()[0]-800)/2,(wx.DisplaySize()[1]-600)/2),style= wx.SYSTEM_MENU | wx.CAPTION | wx.MINIMIZE_BOX | wx.CLOSE_BOX)

        self.SetBackgroundColour((232,232,232))
        self.p = wx.Panel(self,size=(800,6300),pos=(0,0))
        self.SetPages()

    def SetPages(self):
        self.nb = wx.Notebook(self.p,style=wx.NB_BOTTOM)
        page1 = PageOne(self.nb)
        page2 = PageTwo(self.nb)
        self.nb.AddPage(page1, "page1")
        self.nb.AddPage(page2, "page2")
        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.nb, 1, wx.EXPAND)
        self.p.SetSizer(self.sizer)

今、私は 3 番目のノートブック ページを作成し、特定のイベントでそれにフォーカスを設定したいと考えています。しかし、これは機能しません:

def CreateNewPageEvent(self, event):
    self.CreateNewPage()

def CreateNewPage(self):
    page3 = PageThree(self.nb)
    self.nb.AddPage(page3, "page3")

「BoxSizer」が何をするかわからないことを認めなければなりません=/これを機能させるためのアイデアはありますか?

編集: OK、これはメインフレーム クラス内のイベントで機能します。しかし、別のクラスのイベントから新しい nb-page を作成したい:

class ContinueApp(MainFrame):
    def foo(self):
        super(ContinueApp, self).CreateNewPage()

def continueapp(event):
    cont = ContinueApp()
    cont.foo()
4

2 に答える 2

3

BoxSizer (およびその他のサイザー) は、ウィジェットをレイアウトするためのものであるため、ウィジェットを自分で配置する必要はありません。また、アプリケーション ウィンドウを拡大または縮小するときに、どのウィジェットを拡大または拡大するかを制御するのにも役立ちます。あなたの場合、同じウィジェットを同じサイザーに 2 回追加しないでください。1 つのウィジェットを 2 つの異なるサイザーに追加しないでください。

これを削除する必要があります:

self.nb.AddPage(page1, "page3")
self.sizer.Add(self.nb, 1, wx.EXPAND)
self.p.SetSizer(self.sizer)

また、page3 を追加する必要があるときに、ノートブックに page1 を再度追加していることにも注意してください。

page3 = PageThree(self.nb)
self.nb.AddPage(page3, "page3")

プログラムでタブを切り替える場合は、ノートブックの SetSelection メソッドを使用する必要があります。次のチュートリアル(またはその下の回答)で見ることができるサンプルアプリがあります。

タブを切り替えたら、そのタブ内のウィジェットにフォーカスを設定することができます。pubsub を使用してイベントを送信することが、おそらくクラス間で通信する最もクリーンな方法であることがわかりました。その件に関するチュートリアルがいくつかあります。

于 2013-11-04T21:44:56.873 に答える