2014-10-22 99 views
2

我想重新創建一個網格。例如:舊網格是4x4,我想將其更改爲5x5。 這裏是我的代碼:wxpython如何重新創建網格?

import wx 
import wx.xrc 
import wx.grid 

class MyFrame2(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, 
          size=wx.Size(500, 300), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) 

     bSizer4 = wx.BoxSizer(wx.VERTICAL) 
     self.m_grid2 = wx.grid.Grid(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0) 

     # Grid 
     self.m_grid2.CreateGrid(4, 4) 
     bSizer4.Add(self.m_grid2, 0, wx.ALL, 5) 

     self.m_button3 = wx.Button(self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer4.Add(self.m_button3, 0, wx.ALL, 5) 
     self.m_button3.Bind(wx.EVT_BUTTON, self.OnClick) 

     self.SetSizer(bSizer4) 
     self.Layout() 

    def OnClick(self, event): 
     self.m_grid2.CreateGrid(5, 5) 
     self.Layout() 


app = wx.App() 
frame = MyFrame2(None) 
frame.Show(True) 
app.MainLoop() 

它引發一個錯誤,當我運行:

File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\grid.py", line 1221, in CreateGrid 
    return _grid.Grid_CreateGrid(*args, **kwargs) 
wx._core.PyAssertionError: C++ assertion "!m_created" failed at ..\..\src\generic\grid.cpp(2325) in wxGrid::CreateGrid(): wxGrid::CreateGrid or wxGrid::SetTable called more than once 

看來我不能再重新創建此網格。怎麼能做這份工作?

回答

1

您只能調用一次CreateGrid函數。如果你想改變大小,你需要使用函數AppendCols,AppendRows,DeleteCols或DeleteRows。

def OnClick(self, event): 
    self.m_grid2.AppendCols(1) 
    self.m_grid2.AppendRows(1) 
    self.Layout() 

Lokla

+0

如果我有10個列,我必須刪除10次?有沒有其他方法可以做到這一點更乾淨? – tidy 2014-10-22 08:40:41

+0

您一次可以刪除多個列。檢查這些命令的文檔:http://wxpython.org/Phoenix/docs/html/grid.Grid.html#grid.Grid.DeleteCols – Lokla 2014-10-22 17:36:53

2

如果你不想附加的行和列,那麼你就得重新網格本身。這是一個相當簡單的演示,演示如何做到這一點:

import wx 
import wx.grid as gridlib 


######################################################################## 
class MyGrid(gridlib.Grid): 

    #---------------------------------------------------------------------- 
    def __init__(self, parent, rows, cols): 
     gridlib.Grid.__init__(self, parent) 
     self.CreateGrid(rows, cols) 


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

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

     row_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     col_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     self.main_sizer = wx.BoxSizer(wx.VERTICAL) 

     rows_lbl = wx.StaticText(self, label="Rows", size=(30, -1)) 
     row_sizer.Add(rows_lbl, 0, wx.ALL|wx.CENTER, 5) 
     self.rows = wx.TextCtrl(self) 
     row_sizer.Add(self.rows, 0, wx.ALL|wx.EXPAND, 5) 

     cols_lbl = wx.StaticText(self, label="Cols", size=(30, -1)) 
     col_sizer.Add(cols_lbl, 0, wx.ALL|wx.CENTER, 5) 
     self.cols = wx.TextCtrl(self) 
     col_sizer.Add(self.cols, 0, wx.ALL|wx.EXPAND, 5) 

     grid_btn = wx.Button(self, label="Create Grid") 
     grid_btn.Bind(wx.EVT_BUTTON, self.create_grid) 

     self.main_sizer.Add(row_sizer, 0, wx.EXPAND) 
     self.main_sizer.Add(col_sizer, 0, wx.EXPAND) 
     self.main_sizer.Add(grid_btn, 0, wx.ALL|wx.CENTER, 5) 

     self.SetSizer(self.main_sizer) 

    #---------------------------------------------------------------------- 
    def create_grid(self, event): 
     """""" 
     rows = int(self.rows.GetValue()) 
     cols = int(self.cols.GetValue()) 

     if self.grid_created: 
      for child in self.main_sizer.GetChildren(): 
       widget = child.GetWindow() 
       if isinstance(widget, gridlib.Grid): 
        self.main_sizer.Remove(widget) 

     grid = MyGrid(self, rows, cols) 
     self.main_sizer.Add(grid, 0, wx.ALL, 5) 
     self.grid_created = True 

     self.main_sizer.Layout() 


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

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, title="grids", size=(800, 600)) 
     panel = MyPanel(self) 
     self.Show() 

if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop()