Hoe maak je een raster in wxPython?

Ik wil een raster als dit maken:

voer hier de afbeeldingsbeschrijving in

Niet het wx.Grid. Weet iemand hoe dit moet en kan iemand een voorbeeld geven?

Dit is voor een GridSizer of GridBagSizer om de widgets te scheiden.


Antwoord 1, autoriteit 100%

gebruik de tekencontext van de framewxWindow-subklasse(frame/panel/etc… werkelijk elke wxObject bijna).

een manier om dit te doen is dit

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()

je zou het kunnen versnellen door in plaats daarvan treklijnen te gebruiken

   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)

Om te doen wat je wilt met de grid sizer kun je dit doen

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()

je zou dit ook kunnen bereiken met stijlen als deze

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()

Other episodes