2016-11-16 11 views
0

私のプログラムでは、tkinter guiのエントリウィジェットからデータが追加されるsqliteデータベースがあります。私は、データが検証された後にデータベースに追加されるようにしたいと思います。なぜなら、現在のところ検証はないからです。Python - tkinterの入力フィールドを検証する方法

たとえば、以下のmy関数では、customerID、forename、surname、addressおよび電話番号をデータベースのcustomerテーブルに追加します。私はcustomerIDエントリが整数だけを受け入れるようにしたいと思います。forename、surname、addressはNOT NULL、phoneNumberEntryは整数だけを受け入れることができます。

私は人々がvalidatecommandを使用しているのを見ましたが、データをデータベースに追加するコマンドを既に使用しているので、私はそれを実装できるとは思いません。

def appendToCustomerTableEntry(event): 
    top = Toplevel() 
    top.title("Add to customer table") 

    Label(top, text = "customerID: ").grid(sticky = E) 

    customerIDEntry = Entry(top) 
    customerIDEntry.grid(row = 0, column = 1) 

    Label(top, text = "Forename: ").grid(row = 1, sticky = E) 

    customerForenameEntry = Entry(top) 
    customerForenameEntry.grid(row = 1, column = 1) 

    Label(top, text = "Surname: ").grid(row = 2, sticky = E) 

    customerSurnameEntry = Entry(top) 
    customerSurnameEntry.grid(row = 2, column = 1) 

    Label(top, text = "Address: ").grid(row = 3, sticky = E) 

    customerAddressEntry = Entry(top) 
    customerAddressEntry.grid(row = 3, column = 1) 

    Label(top, text = "Phone Number: ").grid(row = 4, sticky = E) 

    customerPhoneNumberEntry = Entry(top) 
    customerPhoneNumberEntry.grid(row = 4, column = 1) 

    exitButton = Button(top, text = "Exit", command = top.destroy) 
    exitButton.grid(row = 5, column = 2, sticky = W) 

    appendButton = Button(top, text = "Append", command = lambda:appendToCustomerTable 
        (customerIDEntry.get(), customerForenameEntry.get(), customerSurnameEntry.get(), 
        customerAddressEntry.get(), customerPhoneNumberEntry.get())) 
    appendButton.grid(row = 5, column = 1, sticky = E) 


def appendToCustomerTable(customerID, Forename, Surname, Address, TelephoneNumber): 
    c.execute("INSERT INTO customerTable VALUES (?, ?, ?, ?, ?);", (customerID, Forename, Surname, Address, TelephoneNumber)) 
    conn.commit() 
+0

あなたは書きました:_Iは、人々がvalidatecommandを使用し見てきましたが、私は私はすでににデータを追加するためのコマンドを使用していていることを実現することができるだろうとは思いませんあなたはそれをどういう意味ですか? 'validatecommand'の使用は、後でどのようにデータを使用するかとは全く関係ありません。これは単に不正な入力(整数フィールドの文字など)を防ぐためのメカニズムです。 –

+0

@BryanOakleyええ私は今何かを考え出しました。私はちょっと前に混乱していただけだったので、このポストを作ることに急いだ。今私は問題の一部が解決されるように整数を受け入れることができる方法を持っています、私はちょうど検証の残りの部分を理解する必要があります – JoeW373

+0

あなたの質問への答えのように思えるのは、すべての入力を受け取り、それらを検証し、データベースにデータを挿入する前にその関数を呼び出すことができます。それはそれとは違うことを何を求めていますか? –

答えて

0

これはSQLの衛生上の問題か、またはPythonプログラミングの問題ですか?

sql衛生上、拒否するSQL文字列や文字を特定する必要がある場合は、これを行うライブラリもあります。 https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

プログラム的に文を実行し、文の順序を変更して文字列置換を使用します。 http://bobby-tables.com/python.html

あなたのコードでは、あなたのことはあなたのフィールドにコードトラフを投稿しようとしているようです。最後のリンクをスペシャルに見てください。

-1

firsty試み「dont repeat your self

# you can declare here the input type of your argument default and the type of them 
def build(ui_title = [], int_arg = 0): 
    # on top you can also assert the input 
    # continue only if ui_title is True else give a AssertionError 
    assert (ui_title), "list is empty!!!" 

    # lets check int_arg for int 
    assert (int_arg==int), "{0} except int get {1}".format(int_arg ,type(int_arg)) 

    for row,text in enumerate(ui_title): 
     Label(top, text = str(text)).grid(sticky = E) 
     customerIDEntry = Entry(top) 
     customerIDEntry.grid(row = int(row), column = 1) 
     if text=="Exit": 
      exitButton = Button(top, text = str(text), command = top.destroy) 
      exitButton.grid(row = int(row), column = 2, sticky = W) 

ui_title = ["customerID", "Forename: ", "Surname: ", "Address: ", "Phone Number: ", "Exit"] 
build(ui_title) # will work 
build(ui_title, int_arg = "Hallo") # will not work, because int_arg get string and the build method will raise a AssertionError 
+0

フィードバックをお願いします。なぜ、投票してください。将来の読者と私のために役立つものではありません........ http://meta.stackexchange.com/questions/135/encouraging-people-to-explain-downvotes –

+0

これは質問された質問には答えません。質問は入力を検証する方法であり、このコードはユーザーが入力ウィジェットで入力したデータを検証しません。 –

+0

thxは、タイプアサーションではないユーザー入力を確認する方法ですか? –

関連する問題