2016-10-06 6 views
0

Ich versuche zu lernen, objectListView in WxPython zu verwenden. Beim Ausführen des Beispiels von Mouse vs.Python. Ich sehe, dass Sie eine Zelle bearbeiten können, aber sobald das Programm geschlossen ist, wird die Änderung nicht gespeichert. Ich habe die Dokumentation von readthedocs für 2 Tage angesehen und ich konnte es nicht funktionieren lassen. Wie erlaubst du eine Bearbeitung und speicherst sie?wxPython objectListView Änderungen speichern

Gibt es Weg, um die Zeilen aus einer CSV-Datei zu erstellen und die Bearbeitung die CSV-Datei zu aktualisieren?

I WxPython Phoenix 3.0.3 und Python 2.7

Hier bin mit meinem Starter-Code:

class Book(object): 
def __init__(self, cue, sendTo, red, green, blue, time): 
    self.cue = cue 
    self.sendTo = sendTo 
    self.red = red 
    self.green = green 
    self.blue = blue 
    self.time = time 
class MainFrame(wx.Frame): 
def __init__(self, parent, id, title): 
    wx.Frame.__init__(self, parent=None, id=wx.ID_ANY, 
         title="ObjectListView", size=(800,600)) 


    panel = wx.Panel(self, -1) 

    #Need to get this information from *.txt file 
    self.cues = [Book("cue 1", "NodeA", 
         "193", "123", "123","0"), 
       Book("cue 2", "Group 1", 
         "193", "123", "123","0") 
       ] 

    self.cuesOlv = ObjectListView(panel, wx.ID_ANY, style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
    self.setCues() 
    self.cuesOlv.cellEditMode = ObjectListView.CELLEDIT_SINGLECLICK 


    mainSizer = wx.BoxSizer(wx.VERTICAL) 

    mainSizer.Add(self.cuesOlv, 1, wx.ALL|wx.EXPAND, 5) 
    #mainSizer.Add(self.updateBtn, 0, wx.ALL|wx.CENTER, 5) 
    panel.SetSizer(mainSizer) 

def setCues(self, data=None): 
    self.cuesOlv.SetColumns([ 
     ColumnDefn("Cue", "center", 100, "cue"), 
     ColumnDefn("Send To:", "center", 100, "sendTo"), 
     ColumnDefn("Red", "center", 100, "red"),    
     ColumnDefn("Green", "center", 100, "green"), 
     ColumnDefn("Blue", "center", 100, "blue"), 
     ColumnDefn("Time", "center", 100, "time") 
    ]) 

    self.cuesOlv.SetObjects(self.cues) 

Mein Ziel ist es, damit der Benutzer einen Wert in jeder Spalte ändern. In der Dokumentation zum Bearbeiten von Zellenwerten sehe ich, dass der erste Schritt das cellEditMode-Attribut setzt. Der nächste Schritt ist, sich für einen Zelleneditor zu entscheiden, und das ist der Punkt, an dem ich verwirrt bin. Wenn ich möchte, dass der Benutzer in der Lage ist, eine beliebige Zelle zu bearbeiten, sollte ich den spaltenbasierten, ereignisbasierten oder den registerbasierten Editor verwenden? Wo kommen 'Getting' und 'Setting' rein? Kann ich GetValue und SetValue verwenden, ohne einen Zelleditor zu erstellen? Dann muss das Model-Objekt aktualisiert werden; kann das nur durch Verlassen der Zelle geschehen oder muss etwas Aktives stattfinden wie das Binden einer Funktion an einen Knopf?

Aus den Beispielen, die Mike Driscoll bietet, sehe ich, wie er die Liste aktualisiert, aber die Änderungen werden nicht gespeichert. Sobald die GUI geschlossen ist, gehen die Änderungen verloren. Wie speichern Sie die Änderungen?

Antwort

0

Ohne irgendwelche csv Module zu verwenden, die das Leben leichter und unter der Annahme einer lokalen book.txt Datei machen könnte, der wie folgt lautet:

"wxPython in Action","Robin Dunn","1932394621","Manning" 
"Hello World","Warren and Carter Sande","1933988495","Manning" 
"Core Python Programming","Wesley Chun","0132269937","Prentice Hall" 
"Python Programming for the Absolute Beginner","Michael Dawson","1598631128","Course Technology" 
"Learning Python","Mark Lutz","0596513984","O'Reilly" 

Nachfolgend erhalten Sie eine vereinfachte Vorstellung davon, wie Ihr Ziel zu erreichen, mit Mike Driscolls Beispielcode

import wx 
from ObjectListView import ObjectListView, ColumnDefn 

######################################################################## 
class Book(object): 
    """ 
    Model of the Book object 

    Contains the following attributes: 
    'ISBN', 'Author', 'Manufacturer', 'Title' 
    """ 
    #---------------------------------------------------------------------- 
    def __init__(self, title, author, isbn, mfg): 
     self.isbn = isbn 
     self.author = author 
     self.mfg = mfg 
     self.title = title 

######################################################################## 
class MainPanel(wx.Panel): 
    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY) 
     #Read the book data from a file 
     with open('books.txt','r') as f: 
      books = f.readlines() 
     self.products = [] 
     #Manually strip out inverted commas and line feeds, then split the data into its parts 
     for b in books: 
      b=b.replace('"','') 
      b=b.strip() 
      title,author,isbn,pub = b.split(",") 
      self.products.append(Book(title,author,isbn,pub)) 
     self.dataOlv = ObjectListView(self, wx.ID_ANY, style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
     self.setBooks() 

     # Allow the cell values to be edited when double-clicked 
     self.dataOlv.cellEditMode = ObjectListView.CELLEDIT_SINGLECLICK 

     # create an Write output file button 
     updateBtn = wx.Button(self, wx.ID_ANY, "Write Output") 
     updateBtn.Bind(wx.EVT_BUTTON, self.updateControl) 
     # Create some sizers 
     mainSizer = wx.BoxSizer(wx.VERTICAL)   
     mainSizer.Add(self.dataOlv, 1, wx.ALL|wx.EXPAND, 5) 
     mainSizer.Add(updateBtn, 0, wx.ALL|wx.CENTER, 5) 
     self.SetSizer(mainSizer) 

    #---------------------------------------------------------------------- 
    def updateControl(self, event): 
     """ 
     Write OLV data to a file 
     """ 
     #retrieve the data from the Olv 
     data=self.dataOlv.GetObjects() 
     #Write the data out to an empty file 
     with open('books1.txt','w') as f: 
      for b in data: 
       outp='"%s","%s","%s","%s"\n'%(b.title,b.author,b.isbn,b.mfg) 
       f.write(outp) 

    #---------------------------------------------------------------------- 
    def setBooks(self, data=None): 
     self.dataOlv.SetColumns([ 
      ColumnDefn("Title", "left", 220, "title"), 
      ColumnDefn("Author", "left", 200, "author"), 
      ColumnDefn("ISBN", "right", 100, "isbn"),    
      ColumnDefn("Mfg", "left", 180, "mfg") 
     ]) 
     self.dataOlv.SetObjects(self.products) 

######################################################################## 
class MainFrame(wx.Frame): 
    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, parent=None, id=wx.ID_ANY, 
          title="ObjectListView Demo", size=(800,600)) 
     panel = MainPanel(self) 

######################################################################## 
class GenApp(wx.App): 

    #---------------------------------------------------------------------- 
    def __init__(self, redirect=False, filename=None): 
     wx.App.__init__(self, redirect, filename) 

    #---------------------------------------------------------------------- 
    def OnInit(self): 
     # create frame here 
     frame = MainFrame() 
     frame.Show() 
     return True 

#---------------------------------------------------------------------- 
def main(): 
    """ 
    Run the demo 
    """ 
    app = GenApp() 
    app.MainLoop() 

if __name__ == "__main__": 
    main()