2016-08-19 9 views
1

私のコードに問題があります。私はウィンドウアプリケーションを作っています。今、私はデータベースにテーブルにデータを挿入して、それを私に(SELECTで)表示する必要があります。私はユーザーの名前とパスワード(IDはテーブルのエントリの数に基づいて計算されます)と入力をトリガーするボタンを入力する2つのフィールドを持っています。それから私は、挿入後に表示される確認と、テーブルから「SELECT」をトリガーするボタンのようなものを持っているフィールドを持っています。アプリケーションは起動しますが、私が知る限り、それはテーブルに追加されません(確認として何も表示されません)。ここに私のコードは次のとおりです。PythonとSQL - 値の挿入と読み取り

from tkinter import * 
import sqlite3 as lite 
import sys 
from Crypto.Cipher import AES 

con = None 
con = lite.connect('test.db') 
cur = con.cursor() 


class Application(Frame): 
    def __init__(self, master): 
     super(Application, self).__init__(master) 
     self.grid() 
     self.create_widgets() 

    def create_widgets(self): 
     self.inst_lbl = Label(self, text = "Dodaj uzytkownika") 
     self.inst_lbl.grid(row = 0, column = 0, columnspan = 2, sticky = W) 

     self.pwa = Label(self, text = "Login") 
     self.pwa.grid(row = 1, column = 0, sticky = W) 

     self.pwb = Label(self, text = "Haslo") 
     self.pwb.grid(row = 2, column = 0, sticky = W) 


     self.a = Entry(self) 
     self.a.grid(row = 1, column = 1, sticky = W) 
     self.b = Entry(self) 
     self.b.grid(row = 2, column = 1, sticky = W) 




     self.submit_bttn = Button(self, text = "Dodaj uzytkownika", command = self.dodaj) 
     self.submit_bttn.grid(row = 3, column = 0, sticky = W) 

     self.secret_txt = Text(self, width = 35, height = 5, wrap = WORD) 
     self.secret_txt.grid(row = 4, column = 0, columnspan = 2, sticky = W) 

     self.view_users = Button(self, text = "Wyswietl uzytkownikow", command = self.wyswietl) 
     self.view_users.grid(row = 10, column = 0, sticky = W) 

     self.users_window = Text(self, width = 35, height = 5, wrap = WORD) 
     self.users_window.grid(row = 11, column = 0, columnspan = 2, sticky = W) 

    def dodaj(self): 
     a = self.a.get() 
     b = self.b.get() 
     index = cur.execute("SELECT COUNT(Id) FROM users") 
     cur.execute("INSERT INTO users (Id, Nazwa, Haslo) VALUES(?,?,?)", (int(index),str(a),str(b))) 
     #obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') 
     #ciphertext = obj.encrypt(test) 
     self.secret_txt.delete(0.0, END) 
     self.secret_txt.insert(0.0, (index, a, b)) 
    def wyswietl(self): 
     viewall = cur.execute("SELECT * FROM users") 
     self.users_window.delete(0.0, END) 
     self.users_window.insert(0.0, viewall) 



root = Tk() 
root.title("ShopQIP") 
root.geometry("1024x700") 
#root.mainloop() 

app = Application(root) 

root.mainloop() 

そして、私はテーブルの内容を表示しようとすると、私はそのフィールドにエラーが表示されます。
0x02A6E220

でsqlite3.Cursorオブジェクトはまた、コードは、実行されますが、それを実行しているとき、私はこのエラーを取得:
*例外Tkinterのコールバックで
トレースバック(最新の呼び出しの最後):
ファイル「C:\ Users \ユーザーkjubus \のAppData \ローカル\プログラム\ Pythonの\ Python35-32 \ lib \ tkinter__init __。py "、行1549、in コール リターンself.func(引数)
ファイル "C:\ Users \ユーザーkjubus \ DyskグーグルSzkoła\ MGR \ PROJEKT inzynierski \ inzynierka v0.1.py!" dodaj
CURでは、ライン52、。 (int、index)、str(a)、str(b))
TypeError:int()引数は必須です。文字列、バイトのようなオブジェクト、または数字ではなく、 'sqlite3.Cursor'

そしてこの部分の "1549"行の前後にはと呼びます。には2つのアンダースコアがあります。

答えて

0

__call__は、オブジェクトと関数を呼び出すための内部メソッドです。あなたはおそらくそれを無視することができます。

カーソルのexecuteメソッドは、通常、影響を受ける行の数のような無害な値を返し、その結果は、fetch*メソッドの1つを別個に呼び出して返されます。だから、あなたはおそらく

cur.execute("SELECT COUNT(Id) FROM users") 
    index = cur.fetchone()[0] # First (and only) element in the single row 
    cur.execute("INSERT INTO users (Id, Nazwa, Haslo) VALUES(?,?,?)", (int(index),str(a),str(b))) 
+0

ようなものが必要(それがその場で「確認」のデータを示している)今動作しているようですが、任意のtest.dbというファイルには影響していないようです。また、2番目の部分(すべてのエントリを表示する)はまだ動作しません – kjubus

+0

これはおそらく、カーソルを作成したデータベース接続の 'commit'メソッドを呼び出していないためです。これは変更を永久にするために必要です – holdenweb

+0

はい、私は con.commit() を追加しました。しかし、私は "選択"の部分を働かせることはできません。何か案が? – kjubus