Я придерживаюсь правила «что я пишу, то и получаю». Поэтому я обычно начинаю с одного из них:
1) Использование размера рамки по умолчанию для панели:

import wx
class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.panel = wx.Panel(self)
self.button = wx.Button(self.panel, label="Test")
self.sizer = wx.BoxSizer()
self.sizer.Add(self.button)
self.panel.SetSizerAndFit(self.sizer)
self.Show()
app = wx.App(False)
win = MainWindow(None)
app.MainLoop()
2) Использование стандартного размера рамки для панели и границы для всего, что внутри:

import wx
class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.panel = wx.Panel(self)
self.button = wx.Button(self.panel, label="Test")
self.sizer = wx.BoxSizer()
self.sizer.Add(self.button)
self.border = wx.BoxSizer()
self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5)
self.panel.SetSizerAndFit(self.border)
self.Show()
app = wx.App(False)
win = MainWindow(None)
app.MainLoop()
3) Использование настраиваемого размера рамки для панели, чтобы я мог управлять им, например, при необходимости вызывать «Fit» и «Layout» на нем:

import wx
class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.panel = wx.Panel(self)
self.button = wx.Button(self.panel, label="Test")
self.windowSizer = wx.BoxSizer()
self.windowSizer.Add(self.panel, 1, wx.ALL | wx.EXPAND)
self.sizer = wx.BoxSizer()
self.sizer.Add(self.button)
self.border = wx.BoxSizer()
self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5)
self.panel.SetSizerAndFit(self.border)
self.SetSizerAndFit(self.windowSizer)
self.Show()
app = wx.App(False)
win1 = MainWindow(None)
app.MainLoop()
Это моя отправная точка. Затем я просто добавляю другие примитивные виджеты и связываю события для них. Если мне нужна новая панель, я обычно помещаю ее в новый модуль и получаю класс Panel. Я делаю то же самое для специальных виджетов, которые должны быть производными от примитивных - таких как панели рисования, холст OpenGL, кнопки специальных случаев и т. Д.
Обычно также неплохо бы отделить функциональность от GUI. Поэтому сначала пишу функциональность так, как она не нуждается в графическом интерфейсе.