2013-01-19 3 views
1

나는 단순히 SQLite3 데이터베이스에 텍스트 데이터 및 정수 데이터 를 저장하는 작은 프로그램을 코딩하고에 데이터를 저장하도록 노력. 나는 그것을 실행할 때이 cur.execute 라인 매개 변수로 문자열을 요구하는 나를 을 알려줍니다,하지만 난 이미로 text1을 정의Tkinter를 응용 프로그램이 sqlite3를 데이터베이스

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') 

문제는 다음과 같습니다

내가 DB를 생성 한

다음 코드와 test.db라고 문자열은 StringVar입니다. StringVarIntVar 전형적인 파이썬 객체 strint이되지 않기 때문에

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() 

답변

2

코드는 실제로 당신이 문자열이나 정수로 중 분류 될 수있는 값을 포함하도록 설정하는 일이 있습니다 Tcl의 변수를 나타내는 작동하지 않습니다 .

가장 먼저해야 할 일은 savedata(text1, int1)에서 savedata(text1.get(), int1.get())으로 변경하여 실제로 저장된 값을 얻는 것입니다. 당신이 그것을 실행하는 대신 실제로 버튼을 클릭하면 함수가 실행되도록 통과하기 때문에 둘째, 당신은 Button 위젯에서 command 매개 변수의 값을 정의하는 방법은 잘못된 것입니다. 해당 부분을 command = lambda: savedata(...)으로 변경하면 문제가 해결됩니다.

지금 코드가 작동
cur.execute('INSERT INTO data (t1, i1) VALUES (?,?)', (text1, int1)) 

하지만 필요가 없습니다 : 셋째, 당신이

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

를 호출하지만 execute에 튜플을 통과하기 때문에 그 확실히, 실패, 당신이 실제로 원하는 것은 여기에 Tcl 변수를 사용하십시오.

+0

감사합니다! mmgp 잘 설명하고 다시 mmgp, 한 번 더 질문을 – Sylvain

+0

안녕을 보여 주었다. – Sylvain

+0

@Sylvain은 어디? – mmgp

관련 문제