今天调试python程序遇到一个告警:
return _core_.Sizer_Add(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion “Assert failure” failed at ..\..\src\common\sizer.cpp(1401) in wxGridSizer::DoInsert(): too many items (4 > 3*1) in grid sizer (maybe you should omit the number of either rows or columns?)
反复比较与示例程序的区别,发现还是一模一样,网上查找别人的程序,也没发现问题,后来终于找到问题原因:
sizer = wx.FlexGridSizer(1, 3, 20, 20)
构造函数:wx.FlexGridsSizer(int rows=1, int cols=0, int vgap=0, int hgap=0)
rows 定义 GridSizer 的行数
cols 定义 GridSizer 的列数
vgap 定义垂直方向上行间距
hgap 定义水平方向上列间距
但是,注意原函数中的行数是 1,列数是 3,因此,在下面使用方法
sizer.Add(b)
添加按钮的时候,按钮总数不能超过 3 个,不然就会产生上面的错误。猜想原因是编译器向sizer中放按钮,到第四个发现没位置放了,所以告警。
修改方案很简单,留够位置就行了,我一共9个按钮,所以把 rows 改为4就可以了。
附源代码:
- #!/usr/bin/env python
- import wx
- import wx.lib.buttons as buttons
- class GenericButtonFrame(wx.Frame):
- def __init__(self):
- wx.Frame.__init__(self, None, -1, ‘Generic Button Example’,
- size=(500, 350))
- panel = wx.Panel(self, -1)
- sizer = wx.FlexGridSizer(4, 3, 20, 20)
- b = wx.Button(panel, -1, “A wx.Button”)
- b.SetDefault()
- sizer.Add(b)
- b = wx.Button(panel, -1, “non-default wx.Button”)
- sizer.Add(b)
- sizer.Add((10, 10))
- b = buttons.GenButton(panel, -1, ‘Generic Button’)
- sizer.Add(b)
- b = buttons.GenButton(panel, -1, ‘disabled Generic’)# invalid generic button
- b.Enable(False)
- sizer.Add(b)
- b = buttons.GenButton(panel, -1, ‘bigger’)# a button with a customer size and color
- b.SetFont(wx.Font(20, wx.SWISS, wx.NORMAL, wx.BOLD, False))
- b.SetBezelWidth(5)
- b.SetBackgroundColour(“Navy”)
- b.SetForegroundColour(“white”)
- b.SetToolTipString(“This is a BIG button…”)
- sizer.Add(b)
- bmp = wx.Image(“bitmap.ico”, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
- b = buttons.GenBitmapButton(panel, -1, bmp)# generic bit button
- sizer.Add(b)
- b = buttons.GenBitmapToggleButton(panel, -1, bmp)# generic bit toggle button
- sizer.Add(b)
- b = buttons.GenBitmapTextButton(panel, -1, bmp, “Bitmapped Text”,
- size=(175, 75))# bit text button
- b.SetUseFocusIndicator(False)
- sizer.Add(b)
- b = buttons.GenToggleButton(panel, -1, “Toggle Button”)# generic toggle button
- sizer.Add(b)
- panel.SetSizer(sizer)
- if __name__==’__main__‘:
- app = wx.PySimpleApp()
- frame = GenericButtonFrame()
- frame.Show()
- app.MainLoop()