2012-07-20 44 views
0

我想打一个网格是这样的:如何在wxPython中创建一个网格?

enter image description here

不是wx.Grid。有谁知道如何做到这一点,并可以提供一个例子?

这将用于GridSizer或GridBagSizer分离小部件。

+0

你只是想抽出一个网格,或者创建一个小部件网格? – 2012-07-20 17:21:05

回答

1

使用帧的绘图上下文 wxWindow子类(框架/面板/等等......实际上几乎任何wxObject)。

做的

一种方式是这样的

import wx 
class MyCustomFrame(wx.Frame): 
    def __init__(self,parent,id): 
     wx.Frame.__init__(self,parent,id) 
     self.Bind(wx.EVT_PAINT,self.OnPaint) 
    def OnPaint(self,evt): 
     self.dc = dc = wx.PaintDC(self) 
     p1 = [0,0] 
     p2 = [500,0] 
     for i in range(100): 
      dc.DrawLine(p1[0],p1[1],p2[0],p2[1]) 
      p1 = [p1[0],p1[1]+5] 
      p2 = [p2[0],p2[1]+5] 
     p1=[0,0] 
     p2 = [0,500] 
     for i in range(100): 
      dc.DrawLine(p1[0],p1[1],p2[0],p2[1]) 
      p1 = [p1[0]+5,p1[1]] 
      p2 = [p2[0]+5,p2[1]] 
if __name__ == "__main__": 
    a = wx.App(redirect=False) 
    f = MyCustomFrame(None,-1) 
    #f.OnPaint(None) --- dont do this!!! 
    f.Show() 
    a.MainLDop() 

您可以通过使用drawlines加快步伐,而不是

def OnPaint(self,evt): 
     self.dc = dc = wx.PaintDC(self) 
     verticle_lines = [(i*5,0,i*5,500) for i in range(100)] 
     horizontal_lines = [(0,i*5,500,i*5) for i in range(100)] 
     dc.DrawLineList(horizontal_lines+verticle_lines) 

为了做你想做的与电网分级机,你可以做到这一点

import wx 
class MyCustomPanel(wx.Panel): 
    def __init__(self,parent,id): 
     wx.Panel.__init__(self,parent,id) 
     self.sz = wx.GridSizer(5,5,0,0) 
     for i in range(25): 
      self.sz.Add(wx.StaticText(self,-1,str(i))) 
     self.SetSizer(self.sz) 
     self.Bind(wx.EVT_PAINT,self.OnPaint) 
    def OnPaint(self,evt): 
     self.dc = dc = wx.PaintDC(self) 
     w,h = self.sz.GetSize() 
     nr = self.sz.GetRows() 
     nc = self.sz.GetCols() 
     cell_w = float(w)/nc 
     cell_h = float(h)/nr 
     hlines = [(0,i*cell_h,w,i*cell_h)for i in range(nr+1)] 
     vlines = [(i*cell_w,0,i*cell_w,h)for i in range(nc+1)] 
     self.dc.DrawLineList(hlines+vlines) 

if __name__ == "__main__": 
    a = wx.App(redirect=False) 
    f1 = wx.Frame(None,-1) 
    f = MyCustomPanel(f1,-1) 
    #f.OnPaint(None) 
    f1.Show() 
    a.MainLoop() 

你也可以用这样的风格完成这个

import wx 
class SimplePanel(wx.Panel): 
    def __init__(self,parent,id,str_val): 
     wx.Panel.__init__(self,parent,id,style=wx.SIMPLE_BORDER) 
     self.sz = wx.BoxSizer() 
     self.sz.Add(wx.StaticText(self,-1,str_val),0,wx.ALIGN_CENTER) 
     self.SetSizer(self.sz) 
class MyCustomPanel(wx.Panel): 
    def __init__(self,parent,id): 

     wx.Panel.__init__(self,parent,id) 
     self.sz = wx.GridSizer(5,5,0,0) 
     for i in range(25): 
      self.sz.Add(SimplePanel(self,-1,str(i)),0,wx.GROW) 
     self.SetSizer(self.sz) 

if __name__ == "__main__": 
    a = wx.App(redirect=False) 
    f1 = wx.Frame(None,-1) 
    f = MyCustomPanel(f1,-1) 
    #f.OnPaint(None) 
    f1.Show() 
    a.MainLoop() 
+0

噢,很好,你知道如何使它与GridSizer或GridBagSizer一起工作来分离小部件吗? (如按钮) – user1513192 2012-07-20 02:43:55

+0

或我怎样才能覆盖GridSizer? – user1513192 2012-07-20 02:50:35

+0

使用一个面板而不是一个框架,并给它使用SetMinSize((w,h))给它的尺寸一个sizer会识别..哦,我看到你的问题...这将需要一段时间来回答... – 2012-07-20 02:55:29