wxGrid行号不与SQLite3数据库同步

wxGrid行号不与SQLite3数据库同步,sqlite,wxpython,wxgrid,Sqlite,Wxpython,Wxgrid,我有一个从SQLite3数据库填充的wx.Grid。用户在文本控件中输入数据,然后单击提交值按钮。将值写入数据库,然后函数将数据库加载到网格中。数据库有一个索引,它从“1”开始。该表如下所示: 创建表循环 索引整数, 第一个整数, 第二个文本, 第三个整数, 第四个整数, 第五个整数, 第六个整数, 第七个整数, 第八个整数, 主键索引 当数据库加载时,列号跳转并从“0”开始,而不是从“1”开始,第一行值填充行“1”,将行“0”留空。如果我将onLoadTable中的行号定义更改为“rowNum

我有一个从SQLite3数据库填充的wx.Grid。用户在文本控件中输入数据,然后单击提交值按钮。将值写入数据库,然后函数将数据库加载到网格中。数据库有一个索引,它从“1”开始。该表如下所示:

创建表循环 索引整数, 第一个整数, 第二个文本, 第三个整数, 第四个整数, 第五个整数, 第六个整数, 第七个整数, 第八个整数, 主键索引

当数据库加载时,列号跳转并从“0”开始,而不是从“1”开始,第一行值填充行“1”,将行“0”留空。如果我将onLoadTable中的行号定义更改为“rowNumb=row+1”,则单击“提交值”按钮时,行从“1”开始,但值填充第二行,使行“1”留空。 以下是全功能、可复制的代码:

import wx
import wx.lib.scrolledpanel as scrolled
import sqlite3 as sqlite
import wx.grid as gridlib


class MasterFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY,"",size=(900,400))

        panel = wx.Panel(self, -1)

        self.db = db
        self.c = self.db.conn.cursor()

        vbox = wx.BoxSizer(wx.VERTICAL)

        self.grid = wx.grid.Grid(panel)
        rowN = self.c.execute('SELECT Count(*) FROM Cycles')
        val = rowN.fetchone()
        rowNum = val[0] + 3
        self.grid.CreateGrid(rowNum,8)
        self.grid.Scroll(0,0)

        self.enterBtn = wx.Button(panel, -1, "Commit Values")
        self.Bind(wx.EVT_BUTTON, self.onEnter, self.enterBtn)

        vbox.Add(self.enterBtn)
        vbox.Add(self.grid)
        panel.SetSizer(vbox)
        panel.Fit()

    def onEnter(self, event):
        First = 1
        Second = 'mine'
        Third = 1
        Fourth = .5
        Fifth = 1
        Sixth = 20
        Seventh = 4
        Eighth = 10

        self.c.execute("INSERT INTO datatable VALUES (NULL,?,?,?,?,?,?,?,?);",(First,Second,Third,Fourth,Fifth,Sixth,Seventh,Eighth))
        self.db.conn.commit()
        self.onLoadTable()

    def onLoadTable(self):       
        self.grid.ClearGrid()      
        for row in range(12):
            rowNumb = row #+ 1
            self.grid.SetRowLabelValue(row, "%s" %rowNumb)

        meta = self.c.execute('SELECT * from datatable') 
        labels = []
        for i in meta.description:
            labels.append(i[0])
        labels = labels[1:]
        for i in range(len(labels)):
            self.grid.SetColLabelValue(i, labels[i])

        all = self.c.execute('SELECT * from datatable')
        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.grid.SetCellValue(row_num, i, str(cells[i]))
        self.db.conn.commit()

class GetDatabase():
    def __init__(self):
        self.conn = sqlite.connect("data4.db") 

if __name__ == "__main__":
    db=GetDatabase()
    app = wx.App(False)
    frame = MasterFrame()
    frame.Show()
    app.MainLoop()

如果我将…WHERE index=%d%rownum添加到SELECT语句中,我会得到sqlite3。操作错误:索引附近:语法错误。

网格从0,0开始,因此请尝试从行数中减去1,即


索引是一个sql关键字。最好给你的专栏起个别的名字,或者用'back quote'引用。我按照建议更改了专栏名称。我确实发现,如果我添加了一条记录,然后使用“DB Browser for SQLite”将主键强制为“0”,那么第一行将正确加载到网格中。我需要从一个空表开始,第一条记录总是以主键“1”开始。工作得很好。再次谢谢你
self.grid.SetCellValue(row_num-1, i, str(cells[i]))