2016-11-08 3 views
-1

flatNotebookの最初のページからテキストファイルを保存し、EXTERNALLYで定義されたsqLiteデータベースに書き込んで、flatNotebookの2ページ目のグリッドに値を書き込もうとしています。 。値はテキストファイルに保存され、データベースに正常に書き込まれますが、同時にグリッドに値を設定することはできません。プログラムを閉じて再起動すると、値がグリッドに表示されます。私は関数onAddCue()を呼び出す方法を理解するのに苦労しています。私はこの時点で自分自身を混乱させるほど多くのことを試みました。私が間違っていることを理解するのを助けてください。ここに私のコード全体があります:wxPython:flatenotebookを使用して別のクラスからグリッドを作成

cue =[4,'NodeA',11,22,33,44,55,66,77,88,99] 

class InitialInputs(scrolled.ScrolledPanel): 
    global cue 
    def __init__(self, parent, db): 
     scrolled.ScrolledPanel.__init__(self, parent, -1) 

     self.db = db 
     self.cur = self.db.con.cursor() 

     self.saveBtn = wx.Button(self, -1, "Save Current Values") 
     self.Bind(wx.EVT_BUTTON, self.onSave, self.saveBtn) 

     self.dirname = "" 

    def onSave(self, event): 
     global cue 

     dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.txt", wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) 
     if dlg.ShowModal() == wx.ID_OK: 
      itcontains = cue 
      self.filename=dlg.GetFilename() 
      self.dirname=dlg.GetDirectory() 
      filehandle=open(os.path.join(self.dirname, self.filename),'w') 
      filehandle.write(str(itcontains)) 
      filehandle.close() 
     dlg.Destroy() 

     row = cue[0] - 1 
     InsertCell ="UPDATE CUES SET 'Send'=?,'RED'=?,'GREEN'=?,'BLUE'=?,'RGB_Alpha'=?,'HUE'=?,'SAT'=?,'BRightness'=?,'HSB_Alpha'=?,'Fade'=? WHERE DTIndex=%i" %row 
     self.cur.execute(InsertCell, cue[1:]) 
     self.db.con.commit() 

     GridPanel().grid.onAddCue() #This is the part that's not working 

class Grid(gridlib.Grid): 
    global cue 
    def __init__(self, parent, db): 
     gridlib.Grid.__init__(self, parent, -1) 
     self.CreateGrid(20,10) 

     for row in range(20): 
      rowNum = row + 1 
      self.SetRowLabelValue(row, "cue %s" %rowNum) 

     self.db = db 
     self.cur = self.db.con.cursor() 
     meta = self.cur.execute("SELECT * from CUES") 
     labels = [] 
     for i in meta.description: 
      labels.append(i[0]) 
     labels = labels[1:] 
     for i in range(len(labels)): 
      self.SetColLabelValue(i, labels[i]) 

     all = self.cur.execute("SELECT * from CUES ORDER by DTindex") 
     for row in all: 
      row_num = row[0] 
      cells = row[1:] 
      for i in range(len(cells)): 
       if cells[i] != None and cells[i] != "null": 
        self.SetCellValue(row_num, i, str(cells[i])) 

     self.Bind(gridlib.EVT_GRID_CELL_CHANGED, self.CellContentsChanged) 

    def CellContentsChanged(self, event): 
     x = event.GetCol() 
     y = event.GetRow() 
     val = self.GetCellValue(y,x) 
     if val == "": 
      val = "null" 
     ColLabel = self.GetColLabelValue(x) 
     InsertCell = "UPDATE CUES SET %s = ? WHERE DTindex = %d"%(ColLabel,y) 
     self.cur.execute(InsertCell, [(val),]) 
     self.db.con.commit() 
     self.SetCellValue(y, x, val) 

class GridPanel(wx.Panel): 
    def __init__(self, parent, db): 
     wx.Panel.__init__(self, parent, -1) 

     self.db = db 
     self.cur = self.db.con.cursor() 

     grid = Grid(self, db) 

     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(grid) 

     self.SetSizer(sizer) 
     self.Fit() 

    def onAddCue(): 
     global cue 
     row = cue[0] - 1 
     col=0 
     while col < 10: 
      for i in cue[1:]: 
       grid.SetCellValue(row, col, str(i)) 
       col = col+1 

class GetDatabase(): 
    def __init__(self, f): 
     # check db file exists 
     try: 
      file = open(f) 
      file.close() 
     except IOError: 
      # database doesn't exist - create file & populate it 
      self.exists = 0 
     else: 
      # database already exists - need integrity check here 
      self.exists = 1 
     self.con = sqlite.connect(f) 

class Frame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1,"Stage Lighting", size=(800,600)) 

     panel = wx.Panel(self) 
     notebook = wx.Notebook(panel) 

     page1 = InitialInputs(notebook, db) 
     page2 = GridPanel(notebook, db) 

     notebook.AddPage(page1, "Initial Inputs") 
     notebook.AddPage(page2, "Grid") 

     sizer = wx.BoxSizer() 
     sizer.Add(notebook, 1, wx.ALL|wx.EXPAND, 5) 
     panel.SetSizer(sizer) 
     self.Layout() 

if __name__ == "__main__": 

    db = GetDatabase("data.db") 

    app = wx.App() 
    logging.basicConfig(level=logging.DEBUG)   
    Frame().Show() 
    app.MainLoop() 

答えて

0

明らかに、質問はpython構文エラーです!

onAddCueは、クラスGridPanelに属するメソッドです。クラスは変数page2でインスタンス化されます。

page2.OnAddCue() 
+0

どちらか、それは私の構文や関数onAddCueの私の配置は()である:

だから、あなたは、このような方法で何かを呼び出す必要があります。 GridPanel()。grid.onAddCue()はTypeErrorを返します。__init __()は3つの引数(1が与えられます)をとります。 GridPanel(parent、db).grid.onAddCue()はNameErrorを返します。グローバル名 'parent'は定義されていません。 onAddCue()はNameErrorを返します。グローバル名 'onAddCue'は定義されていません。 GridPanel.grid.onAddCue()はAttributeErrorを返します。型オブジェクト 'GridPanel'には属性 'grid'がありません。キュー[]は正しく、データベースに書き込みます。他の提案@ravenspoint? –

+0

元の投稿では、プログラムを実行したときに呼び出しが機能しなかったと言っていました。今、あなたは構文エラーが出ていると言っていますか? – ravenspoint

+0

申し訳ありません。たぶん私ははっきりしていない(noob)。 onAddCue関数は、グリッドと同じパネルで使用すると機能します。私はそれを別のパネルから働かせることはできません。だから私はそれが私の構文だと思うのです。助けてくれてありがとう@ravensport、私はまだ学んでいます。 –

関連する問題