Python入門から応用までの学習サイト


レイアウトの組み合わせ

前項までにいくつかのSizerを紹介してきましたが、それらを組み合わせて使用する事によって、より複雑な配置をする事が可能となります。サンプルとして電卓のレイアウトを見てみましょう。

レイアウトのみでイベント設定はしていません。さらにまだ紹介していない「MenuBar」や「TextCtrl」なども登場していますが、これは別項にて説明します。

# -*- coding: utf-8 -*- 

import wx


#--------------------------------------
#    フレームを継承した
#    トップレベルウィンドウクラス
#--------------------------------------
class CalcFrame(wx.Frame):

    def __init__(self):
        
        wx.Frame.__init__(self, None,wx.ID_ANY, u"電卓レイアウト", size=(300,280))

        #    ステータスバーの初期化
        self.CreateStatusBar()
        self.SetStatusText("http://www.python-izm.com/")
        self.GetStatusBar().SetBackgroundColour(None)

        #    メニューバーの初期化
        self.SetMenuBar(CalcMenu())
        
        #    本体部分の構築
        root_panel = wx.Panel(self, wx.ID_ANY)

        text_panel       = TextPanel(root_panel)
        cmdbutton_panel  = CommandButtonPanel(root_panel)
        calcbutton_panel = CalcButtonPanel(root_panel)

        root_layout = wx.BoxSizer(wx.VERTICAL)
        root_layout.Add(text_panel, 0, wx.GROW | wx.ALL, border=10)
        root_layout.Add(cmdbutton_panel, 0, wx.GROW | wx.LEFT | wx.RIGHT, border=20)
        root_layout.Add(calcbutton_panel, 0, wx.GROW | wx.ALL, border=10)
        root_panel.SetSizer(root_layout)
        root_layout.Fit(root_panel)

#--------------------------------------
#    CalcFrameにセットする
#    メニューバークラス
#--------------------------------------
class CalcMenu(wx.MenuBar):

    def __init__(self):

        wx.MenuBar.__init__(self)
        
        menu_file = wx.Menu()
        menu_file.Append(wx.ID_ANY, u"保存")
        menu_file.Append(wx.ID_ANY, u"終了")
        menu_edit = wx.Menu()
        menu_edit.Append(wx.ID_ANY, u"コピー")
        menu_edit.Append(wx.ID_ANY, u"ペースト")
        
        self.Append(menu_file, u"ファイル")
        self.Append(menu_edit, u"編集")

#--------------------------------------
#    画面上部に表示されるテキスト部分
#--------------------------------------
class TextPanel(wx.Panel):

    def __init__(self,parent):
    
        wx.Panel.__init__(self, parent, wx.ID_ANY)
        
        calc_text = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_RIGHT)
        layout = wx.BoxSizer(wx.HORIZONTAL)
        layout.Add(calc_text, 1)
        self.SetSizer(layout)

#--------------------------------------
#    画面中部に表示されるボタン部分
#--------------------------------------
class CommandButtonPanel(wx.Panel):

    def __init__(self,parent):

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

        button_ce = wx.Button(self, wx.ID_ANY, "CE")
        button_c  = wx.Button(self, wx.ID_ANY, "C")
        layout = wx.BoxSizer(wx.HORIZONTAL)
        layout.Add(button_ce, flag=wx.GROW)
        layout.Add(button_c, flag=wx.GROW)
        self.SetSizer(layout)

#--------------------------------------
#    画面下部に表示されるボタン部分
#--------------------------------------
class CalcButtonPanel(wx.Panel):

    def __init__(self,parent):
    
        wx.Panel.__init__(self, parent, wx.ID_ANY)

        button_collection = ("7","8","9","+",
                             "4","5","6","-",
                             "1","2","3","*",
                             "0",".","=","/")

        layout = wx.GridSizer(4, 4, 3, 3)
        
        for i in button_collection:
            layout.Add(wx.Button(self, wx.ID_ANY, i, size=(30,25)), 1, wx.GROW)

        self.SetSizer(layout)


#--------------------------------------
#    カスタムフレームを初期化して
#    アプリケーションを開始
#--------------------------------------
if __name__ == "__main__":

    application = wx.App()
    frame = CalcFrame()
    frame.Show()
    application.MainLoop()

--実行結果--

イベント設定していないので、実行しても動作しません。

wxPython_layout_concept_01



上記サンプルのレイアウト構造は、階層で表示するとこのようになります。人によっては違った印象を持つかもしれませんし、異なる方法で全く同じ配置をする事も可能なので、あくまで一例として考えてください。


(1) Frame -- CalcFrame

        (2) MenuBar -- CalcMenu

        (2) Panel -- root_panel
             縦方向のBoxSizerで3つのパネルを配置

                        (3) Panel -- TextPanel
                             横方向のBoxSizerで1個のテキストを配置

                        (3) Panel -- CommandButtonPanel
                             横方向のBoxSizerで2個のボタンを配置

                        (3) Panel -- CalcButtonPanel
                             4x4マスのGridSizerで16個のボタンを配置

        (2)StatusBar




Python
スタートブック


入門 Python 3


Effective
Python


退屈なことは
Pythonにやらせよう

 
 
 

イベント発生の起点となる事が多いでしょう!

▶GUI:Button



確かな力が身につく
Python「超」入門




P  R