0

wx.Panelを別のwx.Panel内に配置するにはどうすればよいですか?動作しない小さなテストプログラム:

import wx

class TstApp(wx.App):
    def OnInit(self):
        self.frame = wx.Frame(None, -1, "TstApp", wx.DefaultPosition,
        wx.DefaultSize)

        self.pn = wx.Panel(self.frame, -1)
        self.pn2 = wx.Panel(self.pn, -1)
        self.btn = wx.Button(self.pn2, -1, "A Button")

        self.frame.Show()
        self.SetTopWindow(self.frame)

        return True

app = TstApp(0)
app.MainLoop() 
4

2 に答える 2

0

「レイアウト管理」というトピックが完全に欠落しています。zetcodeに関するチュートリアルのレイアウトセクションwx.BoxSizerを読むことをお勧めします。サンプルコードを修正するためにsを導入しました。

import wx

class TstApp(wx.App):
    def OnInit(self):
        self.frame = wx.Frame(None, -1, "TstApp", wx.DefaultPosition,
        wx.DefaultSize)

        self.pn = wx.Panel(self.frame, -1)
        sizer1 = wx.BoxSizer(wx.VERTICAL)
        self.pn.SetSizer(sizer1)

        self.pn2 = wx.Panel(self.pn, -1)
        sizer2 = wx.BoxSizer(wx.VERTICAL)
        self.pn2.SetSizer(sizer2)
        sizer1.Add(self.pn2)

        self.btn = wx.Button(self.pn2, -1, "A Button")
        sizer2.Add(self.btn)

        self.frame.Show()
        self.SetTopWindow(self.frame)

        return True

app = TstApp(0)
app.MainLoop() 

ちなみに、から派生したクラスでウィジェットの作成などをしなければならない方がいいwx.Frameです。

于 2012-09-19T16:52:37.563 に答える
0

phineasがすでに言ったように、ウィジェットを配置するにはサイザーを使用する必要があります。しかし、本当に複数のパネルを並べて配置したい場合は、そのためにサイザーを使用することもできます。

import random
import wx

########################################################################
class RandomPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)
        color = random.choice(["green", "blue", "yellow", "red"])
        self.SetBackgroundColour(color)

########################################################################
class MainPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        firstSubPanel = RandomPanel(self)
        secondSubPanel = RandomPanel(self)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(firstSubPanel, 1, wx.EXPAND|wx.ALL, 5)
        sizer.Add(secondSubPanel, 1, wx.EXPAND|wx.ALL, 5)
        self.SetSizer(sizer)

########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Panels")

        panel = MainPanel(self)


if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    frame.Show()
    app.MainLoop()
于 2012-09-19T17:35:45.500 に答える