SQLite Python;将填充网格的值从滑块写入数据库

SQLite Python; writing a value that populates a grid from a slider to the database

我想用滑块小部件中的值填充 SQLite 数据库。我可以使用键盘更新单元格,但是当从滑块填充单元格时我无法让它工作。我正在使用一个按钮来触发填充和写入数据库,但是当我单击它时,我得到一个 'sqlite3.OperationError: near "0": 语法错误。这是我的代码:

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()

数据库是在 DB Browser for SQLite 中创建的: 创建 TABLE CUES ( DTindex 整数, A 字符串, B 字符串, C 字符串, D 字符串, E 字符串, 主键(DTindex) );

我认为这是这一行中的一个简单错误:

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

0DTindex 的有效值不是列名的有效值,即 A、B、C、D 或 E。
在不知道您想要实现什么的情况下,以下将起作用。

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

但前提是您有一个 DTindex 为 0(零)的记录,它会将 A 列的值替换为滑块的值