スライダウィジェットの値をSQLiteデータベースに取り込みたいとします。私はキーボードを使用してセルを更新することができますが、セルがスライダから移入されたときに動作させることはできません。私は人口とデータベースへの書き込みをトリガするためにボタンを使用していますが、それをクリックすると、sqlite3.OperationError: "0"の近くに構文エラーが表示されます。ここに私のコードは次のとおりです。SQLite Python;グリッドをスライダからデータベースに取り込む値を書き込む
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()
データベースはSQLiteのためにDBブラウザで作成されました: TABLE CUES
( DTindex
INTEGER、 A
文字列、 B
文字列、 C
文字列、 D
文字列、 E
文字列を作成します、 プライマリキー(DTindex
) );
からの値で、列Aの値を置き換え
DTindex
、0(ゼロ)の持つレコードを持っている場合にのみ、データベースにコードがあり、それが何であるか指定していない場合、このコードを実行することはできません。したがって、何がうまくいかないかを知ることは難しいです。 –データベースは独立したファイルです。私はテーブル定義を追加しました。キーボードを使用してセルに値を追加すると、データベースが更新されます。 'self.grid.SetCellValue(0,0、val)'を使用してセルに値を追加すると、データベースは更新されません。私はエラーについて多くの検索を行っており、このエラーの原因はたくさんあるようです。ありがとう@Rolf_of_Saxony –