我使用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()
在我宣布全局变量有效之前,但现在他们没有。我是否可以修改我的按钮和输入字段,以自动减去或添加到数据库中的支票或储蓄帐户,而无需使用列表。我可以在不同类中的函数内调用函数吗?如何根据用户在其他类中输入的特定帐号修改我的支票帐户,而不使用全局变量。
答案 0 :(得分:0)
如果函数位于名为LogIn
的类中,则可能是某个类的某个实例(例如:loginPage = LogIn(...)
)。要调用这些函数,您只需要使用实例(例如:loginPage.log_check()
)
但是,您的大部分功能都是log_check
功能的本地功能,因此根本无法在log_check
之外调用它们。如果需要从其他地方调用它们,请将它们作为对象的方法,而不是嵌入在其他函数中的函数。