96428


以下のコードにてsizerを使用したいのですがどのようにすれば適切にsizerが反映されますか？  
FrameクラスとPanelクラスで分けてあります。  
Panelクラスの中にrpanelというpanelを作成してその上にbotton1とcalendの２つを表示させています。  
表示まではうまくいくのですがSizerを使用してレイアウトをしてもずっと２つとも（0，0）固定で設定したsizerが反映されないです。

動いてほしい挙動としてはrpanelをSizerを利用して横に二分割し、上に' ＜
'のボタンが、その下にcalendが表示される形にしたいと思っています。また、calendに関してはrpanelの横目いっぱいに広がって、Frameの動きに追従する形にしたいです。

[code]

    class Panel(wx.Panel):
        def __init__(self, parent):
            super().__init__(parent, wx.ID_ANY)
            self.SetBackgroundColour("#618264")
    
            rpanel = wx.Panel(self, wx.ID_ANY, size=(500,500))
            rpanel.SetBackgroundColour("#79AC78")
    
    
            button1 = buttons.GenButton(rpanel, -1, '　＜　', style=wx.BORDER_NONE)
    
            calend = wx.lib.calendar.Calendar(rpanel, wx.ID_ANY,)　#size=(500,400))
            calend.SetCurrentDay()
            calend.HideTitle()
            calend.HideGrid()
            calend.SetWeekColor( ("#000000"), ("#79AC78"))
            calend.SetBusType()
            layout = wx.FlexGridSizer(rows=2, cols=1, gap=(10, 10))　
            layout.Add(butoon1, 1, wx.Grow)
            layout.Add(calend, 2, wx.Grow)
            rpanel.SetSizer(layout)
    
[/code]

完成形のイメージとしてはこの図のような形です。MenuとStatusBarはFrameクラスで記述済みです。

[![画像の説明をここに入力](https://i.stack.imgur.com/7KaLy.jpg)](https://i.stack.imgur.com/7KaLy.jpg)


CC BY-SA 4.0
2023-09-29T11:13:41.457
96383
2023-10-05T11:49:46.597
2023-10-05T11:49:46.597
3060
59946
question
python python3
wxPython で Sizer の設定が反映されない


Panelの中に`rpanel`がレイアウトされていないことが主な原因です。  
Panelを横に二分割して左側に`rpanel`を配置したいので、Panel自体に`wx.GridSizer`を`SetSizer`で適用してください。

下記のサンプルコードでは[`SetSizerAndFit`](https://docs.wxpython.org/wx.Window.html?highlight=setsizerandfit#wx.Window.SetSizerAndFit)を使用してサイズを最適化しています。

**サンプルコード**

[code]

    import wx, wx.lib.calendar
    from wx.lib import buttons
    
    class Panel(wx.Panel):
        def __init__(self, parent):
            super().__init__(parent, wx.ID_ANY)
            self.SetBackgroundColour("#618264")
    
            rpanel = wx.Panel(self, wx.ID_ANY, size=(500,500))
            rpanel.SetBackgroundColour("#79AC78")
    
            button1 = buttons.GenButton(rpanel, -1, '　＜　＞　', style=wx.BORDER_NONE)
            calend = wx.lib.calendar.Calendar(rpanel, wx.ID_ANY)
            calend.SetCurrentDay()
            calend.HideTitle()
            calend.HideGrid()
            calend.SetWeekColor( ("#000000"), ("#79AC78"))
            calend.SetBusType()
    
            layout = wx.FlexGridSizer(rows=2, cols=1, gap=(10, 10))
            layout.Add(button1, proportion=wx.GROW, flag=wx.EXPAND) # ボタンを横にExpandする
            layout.Add(calend, wx.GROW, flag=wx.EXPAND)
            rpanel.SetSizerAndFit(layout)
            self_layout = wx.GridSizer(rows=1, cols=2, gap=(0, 0))
            self_layout.Add(rpanel)
            self.SetSizerAndFit(self_layout)  # Panel自体にwx.GridSizerを適用
            parent.Fit() # Frameのサイズを最適にする
    
    application = wx.App()
    frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム')
    menu_bar = wx.MenuBar()
    menu_bar.Append(wx.Menu(), 'ファイル')
    frame.SetMenuBar(menu_bar)
    frame.CreateStatusBar()
    frame.SetStatusText('Hello, Sizer!')
    
    panel = Panel(frame)
    
    frame.Show()
    application.MainLoop()
    
[/code]

**実行結果**

[![実行結果](https://i.stack.imgur.com/GxeDm.png)](https://i.stack.imgur.com/GxeDm.png)


CC BY-SA 4.0
2023-10-05T10:24:39.557
96428
2023-10-05T10:24:39.557
9820
96383
answer