2017-04-26 90 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

完美工作。再次感謝你 –