1

テキストデータと整数データをSQLite3データベースに単純に保存する小さなプログラムをコーディングしています。

test.db次のコードで呼び出されるデータベースを作成しました。

con = sqlite3.connect('test.db')
cur = con.cursor()
cur.execute('drop table if exists data')
cur.execute('create table data(t1 TEXT, i1 INT)')
con.commit()
print('DB created')

問題は、それを実行すると、cur.execute行にパラメーターとして文字列が必要であることがわかりますが、既にtext1文字列としてStringVar.

from tkinter import *
from tkinter import ttk
import sqlite3

def savedata(text1, int1):
    con = sqlite3.connect('test.db')
    cur = con.cursor()
    cur.execute(('INSERT INTO data (t1, i1) VALUES (?,?)', (text1, int1)))
    con.commit()
    print('record inserted in data')

root = Tk()
root.title("Little Program To Save Data")

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column = 0, row = 0, sticky = (N,W,E,S))
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)

text1 = StringVar()
text_entry = ttk.Entry(mainframe, width = 20, textvariable=text1)
text_entry.grid(column = 2, row = 1, sticky = (N,W,E,S))

int1 = IntVar()
int_entry = ttk.Entry(mainframe, width = 20, textvariable=int1)
int_entry.grid(column = 2, row = 2, sticky = (N,W,E,S))

ttk.Button(mainframe, text = "Save!", command=savedata(text1, int1)).grid(column = 3, row = 3, sticky = (W, E))

for child in mainframe.winfo_children(): 
    child.grid_configure(padx = 5, pady = 5)

root.mainloop()
4

1 に答える 1

2

とは典型的な Python オブジェクトではないためStringVar、コードは機能しません。実際には、文字列または整数として分類できる値を含むように設定する可能性のある Tcl 変数を表します。IntVarstrint

最初に行う必要があるのは、それらに格納されている値を実際に取得するように変更savedata(text1, int1)することです。第二に、実際にボタンをクリックしたときに実行される関数を渡すのではなく、ウィジェットでパラメーターsavedata(text1.get(), int1.get())の値を定義する方法が間違っています。その部分を に変更することで修正されます。第三に、あなたは呼んでいますcommandButtoncommand = lambda: savedata(...)

cur.execute(('INSERT INTO data (t1, i1) VALUES (?,?)', (text1, int1)))

しかし、タプルを に渡しているため、それは確かに失敗しexecuteます。実際に必要なのは次のとおりです。

cur.execute('INSERT INTO data (t1, i1) VALUES (?,?)', (text1, int1))

これでコードは機能しますが、ここで Tcl 変数を使用する必要はありません。

于 2013-01-19T22:19:39.770 に答える