wxpython: Aktualisieren eines dict oder einer anderen geeigneten Datentyp aus wx.lib.sheet.CSheet Objekt

StackOverflow https://stackoverflow.com/questions/328003

Frage

Wenn ich ein Notebook mit drei Tabellenkalkulations Widgets haben, was ist die beste Art und Weise Änderungen an der Tabelle zu haben, ein Wörterbuch aktualisieren (oder vielleicht eine SQLite-Datei?). Sie alle wx Raster Objekte mit einem im Wörterbuch zu den SetNumberRows und SetNumberCols Zusammenhang gebaut kommen? Im Grunde ich bin auf der Suche nach, wie mit den vom Benutzer eingegebenen Daten aus einer Tabelle widget, wie in diesem Beispiel aus dem Tutorial auf python.org angepasst arbeiten:

class ExSheet(wx.lib.sheet.CSheet):
    def __init__(self, parent):
        sheet.CSheet.__init__(self, parent)
        self.SetLabelBackgroundColour('#CCFF66')
        self.SetNumberRows(50)
        self.SetNumberCols(50)

class Notebook(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)
        nb = wx.Notebook(self, -1, style=wx.NB_BOTTOM)
        self.sheet1 = ExSheet(nb)
        self.sheet2 = ExSheet(nb)
        self.sheet3 = ExSheet(nb)
        nb.AddPage(self.sheet1, "Sheet1")
        nb.AddPage(self.sheet2, "Sheet2")
        nb.AddPage(self.sheet3, "Sheet3")
        self.sheet1.SetFocus()
        self.StatusBar()
War es hilfreich?

Lösung

Verwenden Sie einen wxGrid mit wxGridTableBase statt

Hier ist ein einfaches Beispiel:

import wx, wx.grid

class GridData(wx.grid.PyGridTableBase):
    _cols = "a b c".split()
    _data = [
        "1 2 3".split(),
        "4 5 6".split(),
        "7 8 9".split()
    ]

    def GetColLabelValue(self, col):
        return self._cols[col]

    def GetNumberRows(self):
        return len(self._data)

    def GetNumberCols(self):
        return len(self._cols)

    def GetValue(self, row, col):
        return self._data[row][col]

    def SetValue(self, row, col, val):
        self._data[row][col] = val

class Test(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.data = GridData()
        grid = wx.grid.Grid(self)
        grid.SetTable(self.data)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
        self.Show()

    def OnClose(self, event):
        print self.data._data
        event.Skip()

app = wx.PySimpleApp()
app.TopWindow = Test()
app.MainLoop()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top