2017-04-26 86 views
0

我有一个从SQLite3数据库填充的wx.Grid。用户在文本控件中输入数据,然后单击“提交值”按钮。这些值被写入数据库,然后该函数将数据库加载到网格中。数据库有一个索引,它从'1'开始。该表是这样的:wxGrid行号不与SQLite3数据库同步

CREATE TABLE Cyclesindex INTEGER, First INTEGER, Second TEXT, Third INTEGER, Fourth INTEGER, Fifth INTEGER, Sixth INTEGER, Seventh INTEGER, Eighth INTEGER, PRIMARY KEY(index

当数据库加载时,列号跳转并从'0'而不是'1'开始,并且第一行值填充行'1',使行'0'空白。如果我将onLoadTable()中的行号定义更改为'rowNumb = row +1',那么当单击“Commit Values”按钮时,行从'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指数=%d”%rowNumb的SELECT语句,我得到sqlite3.OperationalError:近 “指数”:语法错误

+0

指数减去1是一个SQL关键字。更好的名字你列别的东西或引用它'(反引号)。 –

+0

我改变了列建议的名字,我发现如果我添加了一个rec ord然后将主键强制为'0'(使用'DB Browser for SQLite'),第一行将正确加载到网格中。我需要从一个空表开始,第一个记录始终以主键为'1'开始。 –

回答

1

电网开始在(0,0),所以尽量从row_num

self.grid.SetCellValue(row_num-1, i, str(cells[i])) 
+0

完美工作。再次感谢你 –