2017-09-13 2 views
0

Hier ist die Tabelle, die ich bisher erstellt habe.Wie können Sie mit python's wx.grid Spalten zusammenführen?

enter image description here

Hier ist, was ich mag es, schauen möchte mit den Spalten verschmolzen.

enter image description here

Ich möchte die Spalten gestern und heute über drei Spalten jeweils verschmelzen. Gestern wäre also über Equity, Volatilität und Cash. Dann auch für Heute. Ich habe eine Funktion namens wx.grid.SetColSize(self, int col, int width) gefunden, aber es hatte keine Wirkung. Weiß jemand, wie man das macht?

Hier ist auch mein Code.

import wx 
import wx.grid as gridlib 

class MyForm(wx.Frame): 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, parent=None, title="Strategies' Allocations") 
     self.panel = wx.Panel(self) 

     button_refresh = wx.Button(self.panel, id=wx.ID_ANY, label='Refresh') 
     button_refresh.Bind(wx.EVT_BUTTON, self.refresh) 

     self.myGrid1 = gridlib.Grid(self.panel) 
     self.myGrid1.CreateGrid(2, 6) 

     self.myGrid1.SetRowLabelSize(60) 
     self.myGrid1.SetRowLabelValue(0, "") 
     self.myGrid1.SetRowLabelValue(1, "ABRVXX") 

     for i in range(6): 
      self.myGrid1.SetColSize(i, 60) 

     self.myGrid1.SetColLabelValue(0, "") 
     self.myGrid1.SetColLabelValue(1, "Yesterday") 
     self.myGrid1.SetColLabelValue(2, "") 
     self.myGrid1.SetColLabelValue(3, "") 
     self.myGrid1.SetColLabelValue(4, "Today") 
     self.myGrid1.SetColLabelValue(5, "") 

     self.myGrid1.SetCellValue(0, 0, "Equity") 
     self.myGrid1.SetCellValue(0, 1, "Volatility") 
     self.myGrid1.SetCellValue(0, 2, "Cash") 
     self.myGrid1.SetCellValue(0, 3, "Equity") 
     self.myGrid1.SetCellValue(0, 4, "Volatility") 
     self.myGrid1.SetCellValue(0, 5, "Cash") 

     self.myGrid1.SetColLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 
     self.myGrid1.SetDefaultCellAlignment(wx.ALIGN_CENTRE, wx.ALIGN_TOP) 
     # ******************************* # 

     self.myGrid2 = gridlib.Grid(self.panel) 
     self.myGrid2.CreateGrid(2, 6) 

     for i in range(6): 
      self.myGrid2.SetColSize(i, 60) 

     self.myGrid2.SetColLabelValue(0, "") 
     self.myGrid2.SetColLabelValue(1, "Yesterday") 
     self.myGrid2.SetColLabelValue(2, "") 
     self.myGrid2.SetColLabelValue(3, "") 
     self.myGrid2.SetColLabelValue(4, "Today") 
     self.myGrid2.SetColLabelValue(5, "") 

     self.myGrid2.SetCellValue(0, 0, "Treasury") 
     self.myGrid2.SetCellValue(0, 1, "Volatility") 
     self.myGrid2.SetCellValue(0, 2, "Cash") 
     self.myGrid2.SetCellValue(0, 3, "Treasury") 
     self.myGrid2.SetCellValue(0, 4, "Volatility") 
     self.myGrid2.SetCellValue(0, 5, "Cash") 

     self.myGrid2.SetRowLabelSize(60) 
     self.myGrid2.SetRowLabelValue(0, "") 
     self.myGrid2.SetRowLabelValue(1, "ABRXIV") 

     self.myGrid2.SetColLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 
     self.myGrid2.SetDefaultCellAlignment(wx.ALIGN_CENTRE, wx.ALIGN_TOP) 
     # ****************************** # 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.myGrid1, 1, wx.TOP|wx.ALIGN_CENTRE, 2) 
     sizer.Add(self.myGrid2, 1, wx.TOP|wx.ALIGN_CENTRE, 2) 
     sizer.Add(button_refresh, 1, wx.RIGHT|wx.LEFT|wx.TOP|wx.BOTTOM|wx.EXPAND|wx.ALIGN_CENTRE, 50) 

     self.panel.SetSizer(sizer) 
     self.panel.SetSize((500,400)) 
     self.SetSize((500,400)) 
     self.panel.Layout() 

    def refresh(self, event): 
     pass 

if __name__ == "__main__": 
    app = wx.App() 
    frame = MyForm().Show() 
    app.MainLoop() 
+0

nicht sicher, was du meinst. Können Sie mit den Daten im Raster einen Screenshot mit den gesuchten Daten erstellen? – Igor

+0

@Igor Ich habe einen Screenshot hinzugefügt, um zu zeigen, was ich möchte. –

Antwort

2

Eine schnelle und schmutzige Art und Weise ist die Spaltenbeschriftungen SetColLabelSize(0) und fügen Sie die Überschriften als Zellen zu entleeren.
Passen Sie dann die Zellenbereiche nur für diese Zellen mit SetCellSize() an.
Unten habe ich myGrid1 aber nicht myGrid2 geändert.

import wx 
import wx.grid as gridlib 

class MyForm(wx.Frame): 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, parent=None, title="Strategies' Allocations") 
     self.panel = wx.Panel(self) 

     button_refresh = wx.Button(self.panel, id=wx.ID_ANY, label='Refresh') 
     button_refresh.Bind(wx.EVT_BUTTON, self.refresh) 

     self.myGrid1 = gridlib.Grid(self.panel) 
     self.myGrid1.CreateGrid(3, 6) 

     self.myGrid1.SetRowLabelSize(80) 
     self.myGrid1.SetRowLabelValue(0, "") 
     self.myGrid1.SetRowLabelValue(1, "") 
     self.myGrid1.SetRowLabelValue(2, "2") 

     for i in range(6): 
      self.myGrid1.SetColSize(i, 60) 

#  self.myGrid1.SetColLabelValue(0, "") 
#  self.myGrid1.SetColLabelValue(1, "Yesterday") 
#  self.myGrid1.SetColLabelValue(2, "") 
#  self.myGrid1.SetColLabelValue(3, "") 
#  self.myGrid1.SetColLabelValue(4, "Today") 
#  self.myGrid1.SetColLabelValue(5, "") 

     self.myGrid1.SetColLabelSize(0) 
     self.myGrid1.SetCellSize(0, 0, 1, 3) 
     self.myGrid1.SetCellValue(0, 0, "Yesterday") 
     self.myGrid1.SetCellSize(0, 3, 1, 3) 
     self.myGrid1.SetCellValue(0, 3, "Today") 

     self.myGrid1.SetCellValue(1, 0, "Equity") 
     self.myGrid1.SetCellValue(1, 1, "Volatility") 
     self.myGrid1.SetCellValue(1, 2, "Cash") 
     self.myGrid1.SetCellValue(1, 3, "Equity") 
     self.myGrid1.SetCellValue(1, 4, "Volatility") 
     self.myGrid1.SetCellValue(1, 5, "Cash") 

     self.myGrid1.SetColLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 
     self.myGrid1.SetDefaultCellAlignment(wx.ALIGN_CENTRE, wx.ALIGN_TOP) 
     # ******************************* # 

     self.myGrid2 = gridlib.Grid(self.panel) 
     self.myGrid2.CreateGrid(2, 6) 

     for i in range(6): 
      self.myGrid2.SetColSize(i, 60) 

     self.myGrid2.SetColLabelValue(0, "") 
     self.myGrid2.SetColLabelValue(1, "Yesterday") 
     self.myGrid2.SetColLabelValue(2, "") 
     self.myGrid2.SetColLabelValue(3, "") 
     self.myGrid2.SetColLabelValue(4, "Today") 
     self.myGrid2.SetColLabelValue(5, "") 

     self.myGrid2.SetCellValue(0, 0, "Treasury") 
     self.myGrid2.SetCellValue(0, 1, "Volatility") 
     self.myGrid2.SetCellValue(0, 2, "Cash") 
     self.myGrid2.SetCellValue(0, 3, "Treasury") 
     self.myGrid2.SetCellValue(0, 4, "Volatility") 
     self.myGrid2.SetCellValue(0, 5, "Cash") 

     self.myGrid2.SetRowLabelSize(60) 
     self.myGrid2.SetRowLabelValue(0, "") 
     self.myGrid2.SetRowLabelValue(1, "2") 

     self.myGrid2.SetColLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 
     self.myGrid2.SetDefaultCellAlignment(wx.ALIGN_CENTRE, wx.ALIGN_TOP) 
     # ****************************** # 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.myGrid1, 1, wx.TOP|wx.ALIGN_CENTRE, 2) 
     sizer.Add(self.myGrid2, 1, wx.TOP|wx.ALIGN_CENTRE, 2) 
     sizer.Add(button_refresh, 1, wx.RIGHT|wx.LEFT|wx.TOP|wx.BOTTOM|wx.EXPAND|wx.ALIGN_CENTRE, 50) 

     self.panel.SetSizer(sizer) 
     self.panel.SetSize((500,400)) 
     self.SetSize((500,400)) 
     self.panel.Layout() 

    def refresh(self, event): 
     pass 

if __name__ == "__main__": 
    app = wx.App() 
    frame = MyForm().Show() 
    app.MainLoop() 

enter image description here

+0

Für das, was ich versuche, wird das erledigt. Danke für die Hilfe. –

+0

@AlexF Ich habe zurück angepasste Bilder hinzugefügt, nachdem Sie beide Antworten bearbeiten. Fühlen Sie sich frei, um zu redigieren, wenn es noch ein Datenschutzproblem gibt. –

+0

das ist großartig. Immer noch sehr hilfreich für diejenigen, die es brauchen, aber die Privatsphäre bewahrt. Danke für die Aufnahme. –

1

Dies wird nicht besonders einfach sein, aber ich denke, Sie sollten erreichen, was Sie von wxGridCellAttrProvider durch die Definition einer Klasse Ableitungs wollen und zwingende seine GetColumnHeaderRenderer() Methode eine Rückkehr „nichts tun“ wxGridColumnHeaderRenderer für die Spalten Sie wollen zusammengeführt werden und der Standard-Renderer (der von der Basisklasse GetColumnHeaderRenderer() zurückgegeben wird) für die anderen. Dann müssen Sie nur SetAttrProvider() mit Ihrem benutzerdefinierten Attributanbieterobjekt auf Ihrem Tabellenobjekt aufrufen.

2

einen Blick auf die GridLabelRenderer Probe in der Demo WxPython nehmen. Es ist ein Beispiel für das Zeichnen benutzerdefinierter Beschriftungen für Rasterzeilen und -spalten basierend auf den Klassen in wx.lib.mixins.gridlabelrenderer. Mit diesen Klassen wird es ziemlich einfach, die Beschriftungen zu zeichnen, wie Sie wollen. Sie müssen nur die entsprechenden Draw-Methoden überschreiben.

0

Wie von @RobinDunn vorgeschlagen ist hier eine Version (von Art) mit der GridLabelRenderer, die nicht so kompliziert ist, wie es zuerst aussieht.
Es hat eine Eigenart oder zwei aber.
Beachten Sie die Verwendung von l und rrect.left und rect.right zu speichern.
Es ist so gemacht, denn wenn man rect.left einstellen, right.right auch passt, ohne dass Sie es zu fragen.
Ich gehe davon aus, dass dies, weil die rect eine Größe hat, also wenn Sie ein Element anpassen, die andere ausgleicht.
Beachten Sie auch, dass Sie die leeren Spaltenüberschriften zu erklären haben, sonst werden sie auf den Standard „A, B, C, D .....“ Sequenz zurück.

import wx 
import wx.grid as grid 
import wx.lib.mixins.gridlabelrenderer as glr 
#---------------------------------------------------------------------- 
class MyGrid(grid.Grid, glr.GridWithLabelRenderersMixin): 
    def __init__(self, *args, **kw): 
     grid.Grid.__init__(self, *args, **kw) 
     glr.GridWithLabelRenderersMixin.__init__(self) 

class TextLabelRenderer(glr.GridLabelRenderer): 
    def __init__(self, text, colspan,bgcolour=None): 
     self.text = text 
     self.colspan = colspan 
     if bgcolour is not None: 
      self.bgcolour = bgcolour 
     else: 
      self.bgcolour = "white" 

    def Draw(self, grid, dc, rect, col): 
     if self.colspan == 0: 
      rect.SetSize((0,0)) 
     if self.colspan > 1: 
      add_cols = self.colspan - 1 
      l = rect.left 
      r = rect.right + ((rect.Size.x -1) * add_cols) 
      rect.left = l 
      rect.right = r 
     dc.SetBrush(wx.Brush(self.bgcolour)) 
     dc.SetPen(wx.TRANSPARENT_PEN) 
     dc.DrawRectangleRect(rect) 
     hAlign, vAlign = grid.GetColLabelAlignment() 
     text = self.text 
     if self.colspan != 0: 
      self.DrawBorder(grid, dc, rect) 
     self.DrawText(grid, dc, rect, text, hAlign, vAlign) 

class TestPanel(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, parent=None, size=(800,300)) 
     ROWS = 6 
     COLS = 11 
     g = MyGrid(self, size=(100,100)) 
     g.CreateGrid(ROWS, COLS) 
     g.SetColLabelRenderer(0, TextLabelRenderer('Contract',1,"lightblue")) 
     g.SetColLabelRenderer(1, TextLabelRenderer('Yesterday',3,"lightgreen")) 
     g.SetColLabelRenderer(2, TextLabelRenderer('',0)) 
     g.SetColLabelRenderer(3, TextLabelRenderer('',0)) 
     g.SetColLabelRenderer(4, TextLabelRenderer('Today',4,"green")) 
     g.SetColLabelRenderer(5, TextLabelRenderer('',0)) 
     g.SetColLabelRenderer(6, TextLabelRenderer('',0)) 
     g.SetColLabelRenderer(7, TextLabelRenderer('',0)) 
     g.SetColLabelRenderer(8, TextLabelRenderer('Other',1,"gold")) 
     # g.SetColLabelRenderer(9, TextLabelRenderer('',0)) 
     g.SetRowLabelSize(0) 
     g.SetCellValue(0, 1, "Equity") 
     g.SetCellValue(0, 2, "Volatility") 
     g.SetCellValue(0, 3, "Cash") 
     g.SetCellValue(0, 4, "Equity") 
     g.SetCellValue(0, 5, "Volatility") 
     g.SetCellValue(0, 6, "Cash") 
     g.SetCellValue(1, 0, "2") 
     g.SetCellValue(1, 1, "1500") 
     g.SetCellValue(1, 2, "23") 
     g.SetCellValue(1, 3, "2300") 
     g.SetCellValue(1, 4, "1400") 
     g.SetCellValue(1, 5, "26") 
     g.SetCellValue(1, 6, "2400") 
     g.SetColLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 
     g.SetDefaultCellAlignment(wx.ALIGN_CENTRE, wx.ALIGN_TOP) 

     g1 = MyGrid(self, size=(100,100)) 
     g1.CreateGrid(ROWS, COLS) 
     g1.SetColLabelRenderer(0, TextLabelRenderer('Contract',1,"lightblue")) 
     g1.SetColLabelRenderer(1, TextLabelRenderer('Yesterday',3,"lightgreen")) 
     g1.SetColLabelRenderer(2, TextLabelRenderer('',0)) 
     g1.SetColLabelRenderer(3, TextLabelRenderer('',0)) 
     g1.SetColLabelRenderer(4, TextLabelRenderer('Today',3,"green")) 
     g1.SetColLabelRenderer(5, TextLabelRenderer('',0)) 
     g1.SetColLabelRenderer(6, TextLabelRenderer('',0)) 
     g1.SetColLabelRenderer(7, TextLabelRenderer('Other',2,"gold")) 
     g1.SetColLabelRenderer(8, TextLabelRenderer('',0)) 
     g1.SetRowLabelSize(0) 
     g1.SetCellValue(0, 1, "Equity") 
     g1.SetCellValue(0, 2, "Volatility") 
     g1.SetCellValue(0, 3, "Cash") 
     g1.SetCellValue(0, 4, "Equity") 
     g1.SetCellValue(0, 5, "Volatility") 
     g1.SetCellValue(0, 6, "Cash") 
     g1.SetCellValue(1, 0, "2") 
     g1.SetCellValue(1, 1, "500") 
     g1.SetCellValue(1, 2, "23") 
     g1.SetCellValue(1, 3, "12300") 
     g1.SetCellValue(1, 4, "11400") 
     g1.SetCellValue(1, 5, "26") 
     g1.SetCellValue(1, 6, "12400") 
     g1.SetColLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) 
     g1.SetDefaultCellAlignment(wx.ALIGN_CENTRE, wx.ALIGN_TOP) 
     self.Sizer = wx.BoxSizer(wx.VERTICAL) 
     self.Sizer.Add(g, 1, wx.EXPAND) 
     self.Sizer.Add(g1, 1, wx.EXPAND) 
     self.Show() 
#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = wx.App() 
    frame = TestPanel() 
    app.MainLoop() 

enter image description here

Verwandte Themen