0

注意してください:これはwxPythonの複製ではありません:同じフレームに複数のウィジェットを表示する、その質問に疑問が追加されました。

わかりました、私はすでにノートブックとボタンを同じフレームに持っています。ソースコード:

import wx
import wx.lib.sheet as sheet

class MySheet(sheet.CSheet):
    def __init__(self, parent):
        sheet.CSheet.__init__(self, parent)

        self.SetLabelBackgroundColour('#CCFF66')
        self.SetNumberRows(50)
        self.SetNumberCols(50)


class Notebook(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(600, 600))
        menubar = wx.MenuBar()
        file = wx.Menu()
        file.Append(101, 'Quit', '' )
        menubar.Append(file, "&File")
        self.SetMenuBar(menubar)
        wx.EVT_MENU(self, 101, self.OnQuit)
        nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
        self.sheet1 = MySheet(nb)
        self.sheet2 = MySheet(nb)
        self.sheet3 = MySheet(nb)
        nb.AddPage(self.sheet1, "Sheet1")
        nb.AddPage(self.sheet2, "Sheet2")
        nb.AddPage(self.sheet3, "Sheet3")
        self.sheet1.SetFocus()
        self.StatusBar()



        self.button1 = wx.Button(self, -1, label = "Ok")
        #self.button2 = wx.Button(self, -1, label = "Not Ok")

        sizerV = wx.BoxSizer(wx.VERTICAL)

        # add notebook first, with size factor 2:
        sizerV.Add(nb, 5)
        # then text, size factor 1, maximized
        sizerV.Add(self.button1, 1, wx.EXPAND)

        # assign the sizer to Frame:
        self.SetSizerAndFit(sizerV)

def StatusBar(self):
    self.statusbar = self.CreateStatusBar()

def OnQuit(self, event):
    self.Close()


class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(450, 400))
        self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
        self.Center()

class MyApp(wx.App):
    def OnInit(self):
        frame = Notebook(None, -1, 'Pandel.py')
        frame.Show(True)
        frame.Center()
        frame2 = MyFrame(None, -1, '')
        self.SetTopWindow(frame2)
        return True


app = MyApp(0)
app.MainLoop()

出力: サンプル出力

しかし、画面全体に 1 つの大きなボタンではなく、互いに隣接する 2 つのボタンが必要です。

つまり、wx.HORIZONTAL と WX.VERTICAL サイザーを一緒に使用したいということです。どうすればいいですか?

4

1 に答える 1

2

サイザーやパネルなどを考える最良の方法は、それらがコンテナーであるということです。複雑なレイアウトの場合は、鉛筆と紙を用意してレイアウトをスケッチすることをお勧めします。次に、ウィジェットの周りにボックスを描きます。これらのボックスはサイザーです (または、パネルとサイザーの場合もあります)。とにかく、これらすべての図から、ボックスを相互にネストできることがすぐにわかります。それが BoxSizers の鍵です。それらをネストできます!混乱を招く可能性がありますが、コードを非常に明確で適切に設計しておくと、うまく機能します。

とにかく、私の散文は十分です。コードは次のとおりです。

import wx
import wx.lib.sheet as sheet

class MySheet(sheet.CSheet):
    def __init__(self, parent):
        sheet.CSheet.__init__(self, parent)
        self.SetLabelBackgroundColour('#CCFF66')
        self.SetNumberRows(50)
        self.SetNumberCols(50)

class Notebook(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(600, 600))
        menubar = wx.MenuBar()
        file = wx.Menu()
        file.Append(101, 'Quit', '' )
        menubar.Append(file, "&File")
        self.SetMenuBar(menubar)
        wx.EVT_MENU(self, 101, self.OnQuit)
        nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
        self.sheet1 = MySheet(nb)
        self.sheet2 = MySheet(nb)
        self.sheet3 = MySheet(nb)
        nb.AddPage(self.sheet1, "Sheet1")
        nb.AddPage(self.sheet2, "Sheet2")
        nb.AddPage(self.sheet3, "Sheet3")
        self.sheet1.SetFocus()
        self.StatusBar()
        self.button1 = wx.Button(self, -1, label = "Ok")
        self.button2 = wx.Button(self, -1, label = "Not Ok")
        sizerV = wx.BoxSizer(wx.VERTICAL)
        sizerH = wx.BoxSizer(wx.HORIZONTAL)
        # add notebook first, with size factor 2:
        sizerV.Add(nb, 5)
        # then text, size factor 1, maximized
        sizerH.Add(self.button1, 1, wx.EXPAND)
        sizerH.Add(self.button2, 1, wx.EXPAND)
        sizerV.Add(sizerH, 1, wx.ALL|wx.EXPAND, 5)
        # assign the sizer to Frame:
        self.SetSizerAndFit(sizerV)

    def StatusBar(self):
        self.statusbar = self.CreateStatusBar()

    def OnQuit(self, event):
        self.Close()

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(450, 400))
        self.text = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
        self.Center()

class MyApp(wx.App):
    def OnInit(self):
        frame = Notebook(None, -1, 'Pandel.py')
        frame.Show(True)
        frame.Center()
        frame2 = MyFrame(None, -1, '')
        self.SetTopWindow(frame2)
        return True

app = MyApp(0)
app.MainLoop()
于 2013-06-27T13:23:15.407 に答える