2016-10-28 12 views
0

スライダウィジェットの値をSQLiteデータベースに取り込みたいとします。私はキーボードを使用してセルを更新することができますが、セルがスライダから移入されたときに動作させることはできません。私は人口とデータベースへの書き込みをトリガするためにボタンを使用していますが、それをクリックすると、sqlite3.OperationError: "0"の近くに構文エラーが表示されます。ここに私のコードは次のとおりです。SQLite Python;グリッドをスライダからデータベースに取り込む値を書き込む

import wx 
import wx.grid as gridlib 
import sqlite3 

class Grid(gridlib.Grid): 
    def __init__(self, parent, db): 
     gridlib.Grid.__init__(self, parent) 
     self.CreateGrid(10,5) 

     for row in range(10): 
      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 TestFrame(wx.Frame): 
    def __init__(self, parent, db): 
     wx.Frame.__init__(self, parent, -1, "Grid plus db", size = (800,600)) 

     panel = wx.Panel(self, -1) 

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

     sizer = wx.GridBagSizer(vgap=10, hgap=10) 

     self.slide1 = wx.Slider(panel, -1, 0, 0, 255, size=(50,400), 
            style=wx.SL_VERTICAL|wx.SL_AUTOTICKS|wx.SL_LABELS|wx.SL_INVERSE) 
     self.slide1.SetTickFreq(10) 
     self.Bind(wx.EVT_SCROLL_CHANGED, self.onReport, self.slide1) 
     self.slide2 = wx.Slider(panel, -1, 0, 0, 255, size=(50,400), 
           style=wx.SL_VERTICAL|wx.SL_AUTOTICKS|wx.SL_LABELS|wx.SL_INVERSE) 
     self.slide2.SetTickFreq(10) 

     self.grid = Grid(panel,db) 

     self.display = wx.TextCtrl(panel, -1, size=(200,100), style=wx.TE_MULTILINE) 

     self.aBtn = wx.Button(panel, -1, "Grid") 
     self.Bind(wx.EVT_BUTTON, self.onPopulate, self.aBtn) 

     self.bBtn = wx.Button(panel, -1, "Database") 

     sizer.Add(self.slide1, pos=(0,0)) 
     sizer.Add(self.slide2, pos=(0,1)) 
     sizer.Add(self.grid, pos = (0,2)) 
     sizer.Add(self.aBtn, pos=(1,0)) 
     sizer.Add(self.display, pos=(1,1), span=(2,2)) 
     sizer.Add(self.bBtn, pos=(2,0)) 

     panel.SetSizer(sizer) 
     panel.Fit() 

    def onReport(self,event): 
     val = self.slide1.GetValue() 
     self.display.WriteText("Slide 1 value = %s\n"%val) 

    def onPopulate(self, event): 
     """Work in Progress""" 
     val = str(self.slide1.GetValue()) + '\n' 
     #put a dlg here to get row col - place in SetCellValue(x,y,.... 
     self.grid.SetCellValue(0,0, val) #gets it to the grid...Need to write it to the database  
     InsertCell = "UPDATE CUES SET %s = ? WHERE DTindex = %d"%(0,0) 
     self.cur.execute(InsertCell, [(val),]) 
     self.db.con.commit() 

class GetDatabase(): 
    def __init__(self, f): 
     try: 
      file = open(f) 
      file.close() 
     except IOError: 
      self.exists = 0 
     else: 
      self.exists = 1 
     self.con = sqlite3.connect(f) 


if __name__ == "__main__": 
    import sys 
    db = GetDatabase("data.db") 
    app = wx.App() 
    frame = TestFrame(None, db) 
    frame.Show(True) 
    app.MainLoop() 

データベースはSQLiteのためにDBブラウザで作成されました: TABLE CUESDTindex INTEGER、 A文字列、 B文字列、 C文字列、 D文字列、 E文字列を作成します、 プライマリキー(DTindex) );

+0

からの値で、列Aの値を置き換えDTindex、0(ゼロ)の持つレコードを持っている場合にのみ、データベースにコードがあり、それが何であるか指定していない場合、このコードを実行することはできません。したがって、何がうまくいかないかを知ることは難しいです。 –

+0

データベースは独立したファイルです。私はテーブル定義を追加しました。キーボードを使用してセルに値を追加すると、データベースが更新されます。 'self.grid.SetCellValue(0,0、val)'を使用してセルに値を追加すると、データベースは更新されません。私はエラーについて多くの検索を行っており、このエラーの原因はたくさんあるようです。ありがとう@Rolf_of_Saxony –

答えて

0

私はそれがこのラインでは、単純な誤りだと思う:DTindexの有効な値は、A、B、C、Dとなり、列名の有効な値ではないながら

InsertCell = "UPDATE CUES SET %s = ? WHERE DTindex = %d"%(0,0) 

0
あなたが達成しようとしていることを正確に知らなければ、以下が機能します。

InsertCell = "UPDATE CUES SET %s = ? WHERE DTindex = %d"%('A',0) 

しかし、あなたはの構造を定義していないとして、それはあなたのスライダー

+0

完全に働いた。それは何か簡単でなければならないことを知っていた。ありがとう@Rolf_of_Saxony –

関連する問題