SQLite3和Tkinter Python:根据用户输入

时间:2015-12-17 19:00:43

标签: python sql python-3.x tkinter sqlite

我使用Tkinter创建了一个ATM GUI程序,并使用python的sqlite3作为存储帐号,PIN码和人员支票和储蓄帐户余额的方法。我在处理支票帐户和储蓄帐户的数据时遇到问题。在没有SQL数据库之前,我设置程序的方式是我有名为checkAmnt, saveAmnt, and balanceAmnt的列表,起始值分别为5000.00,1000,00和6000.00。因此,如果我想添加或删除金额,我会在指定的列表中添加一个数字,即:-20.00用于提取20美元或1000.00用于存款或转账。然后我会编写一个脚本来获得平衡:

 for _ in checkAmnt:
            check_balance = float(sum(checkAmnt))

现在我正在尝试做同样的事情,但修改我的脚本以使用SQLite3。所以我编写了一个具有登录页面的函数,当您登录时,它会拉出与特定帐号相关联的值。

 def log_check(self):

        def get_account_number(): 
            actNum = int(act_num_entry.get())
            return actNum
        def get_pin_number():
            pinNum = int(pin_num_entry.get())
            return pinNum   
        con = sqlite3.connect('bank_accounts.db')    
        c = con.cursor()
        def start_checkAmnt():        
            sql_chk = ("SELECT CHECKING FROM Account WHERE Account = ?",(get_account_number(),))
            c.execute(*sql_chk)
            chk = c.fetchone()
            start_checkAmnt=list(chk)
            return start_checkAmnt
        def start_saveAmnt():
            sql_sve = ("SELECT SAVINGS FROM Account WHERE Account = ?",(get_account_number(),))
            c.execute(*sql_sve)
            sve = c.fetchone()
            start_saveAmnt=list(sve)
            return start_saveAmnt
        def start_balance():
            sql_bal=("SELECT BALANCE FROM Account WHERE Account = ?",(get_account_number(),))
            c.execute(*sql_bal)
            bal = c.fetchone()
            balanceAmnt=list(bal)
            return balanceAmnt  
        def get_dbActNum():
            try:
                sqla = ("SELECT ACCOUNT FROM Account WHERE ACCOUNT = ?", (get_account_number(),))
                c.execute(*sqla)
                dbActNum = c.fetchone()
                return dbActNum
            except:
                pass
        def get_dbPinNum():
            try:
                sqlp = ("SELECT PIN FROM Account WHERE Account = ?", (get_account_number(),))
                c.execute(*sqlp)
                dbPinNum = c.fetchone() 
                return dbPinNum
            except:
                pass

        try:
            if get_account_number() in get_dbActNum() and get_pin_number() in get_dbPinNum():
# This next part creates a database login which I use to use as a check for when I prompt the user to Re-login to complete another trnsaction
                con = sqlite3.connect('login.db')    
                c = con.cursor()
                c.execute("DROP TABLE IF EXISTS reloginCheck")
                c.execute("CREATE TABLE reloginCheck(Account INT, PIN_Num INT)")
                c.execute("INSERT INTO reloginCheck VALUES(?,?)", (get_account_number(), get_pin_number()))
                con.commit() 
                tm.showinfo("ATM Login", "Login Successful")
                self.controller.show_frame(WelcomePage)
            else:
                tm.showerror("Login Error", "Invalid Entry")
        except UnboundLocalError and TypeError:
            tm.showerror("Login Error", "Can't Find Account")
            self.controller.show_frame(LogIn)
            pass

此脚本有效,但我在其他类中调用get_account_number()start_saveAmnt时遇到问题,例如我的支票提款或提款提取,因为它们位于我的函数log_check()中调用LogIn()我试过LogIn.log_check().get_account_number()在我宣布全局变量有效之前,但现在他们没有。我是否可以修改我的按钮和输入字段,以自动减去或添加到数据库中的支票或储蓄帐户,而无需使用列表。我可以在不同类中的函数内调用函数吗?如何根据用户在其他类中输入的特定帐号修改我的支票帐户,而不使用全局变量。

1 个答案:

答案 0 :(得分:0)

如果函数位于名为LogIn的类中,则可能是某个类的某个实例(例如:loginPage = LogIn(...))。要调用这些函数,您只需要使用实例(例如:loginPage.log_check()

但是,您的大部分功能都是log_check功能的本地功能,因此根本无法在log_check之外调用它们。如果需要从其他地方调用它们,请将它们作为对象的方法,而不是嵌入在其他函数中的函数。