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)
0
而 DTindex
的有效值不是列名的有效值,即 A、B、C、D 或 E。
在不知道您想要实现什么的情况下,以下将起作用。
InsertCell = "UPDATE CUES SET %s = ? WHERE DTindex = %d"%('A',0)
但前提是您有一个 DTindex
为 0(零)的记录,它会将 A 列的值替换为滑块的值
我想用滑块小部件中的值填充 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)
0
而 DTindex
的有效值不是列名的有效值,即 A、B、C、D 或 E。
在不知道您想要实现什么的情况下,以下将起作用。
InsertCell = "UPDATE CUES SET %s = ? WHERE DTindex = %d"%('A',0)
但前提是您有一个 DTindex
为 0(零)的记录,它会将 A 列的值替换为滑块的值