制作一个ATM程序,功能如下账户登录,用户输入账号和密码,经过验证后可进入主界面“主界面,用户登录后显示欢迎信息,在读界面显示各种功能按钮,如:查询余额、修改密码等,点击备个功能按钮,可进入相应取款、存款、查看明细记录、转账、界面进行操作。“
自行设计数据库和数据表,要求界面美观,功能齐全,可参考现实中 AIM 的功能和界面。
注:要用python+Gui连接数据库。
参考:https://blog.csdn.net/YANSHUOXU/article/details/103567405/
首先,我们需要创建一个数据库,并在数据库中创建一张表来存储用户的信息。我们可以使用 Python 的 pymysql 模块来连接数据库。
首先,我们需要在数据库中创建一张表,表的结构如下:
ID | 姓名 | 账号 | 密码 | 余额 |
---|---|---|---|---|
1 | 张三 | 12345 | 12345 | 1000 |
2 | 李四 | 67890 | 67890 | 2000 |
然后,我们需要编写一个登录界面,用户输入账号和密码后,点击“登录”按钮。我们可以使用 Python 的 Tkinter 模块来创建 GUI 界面。
代码示例如下:
import tkinter as tk
import pymysql
# 连接数据库
db = pymysql.connect(host='localhost', user='root', password='123456', database='atm')
# 创建登录界面
root = tk.Tk()
root.title('ATM')
# 账号输入框
account_label = tk.Label(root, text='账号:')
account_label.grid(row=0, column=0)
account_entry = tk.Entry(root)
account_entry.grid(row=0, column=1)
# 密码输入框
password_label = tk.Label(root, text='密码:')
password_label.grid(row=1, column=0)
password_entry = tk.Entry(root, show='*')
password_entry.grid(row=1, column=1)
# 登录按钮
def login():
# 获取账号和密码
account = account_entry.get()
password = password_entry.get()
# 使用数据库查询该用户是否存在
cursor = db.cursor()
sql = 'SELECT * FROM users WHERE account=%s AND password=%s'
cursor.execute(sql, (account, password))
result = cursor.fetchone()
# 如果用户存在,则进入主界面
if result:
main_window()
else:
tk.messagebox.showinfo('提示', '账号或密码错误!')
login_button = tk.Button(root, text='登录', command=login)
login_button.grid(row=2, column=0)
root.mainloop()
接下来,我们需要编写主界面,在主界面中显示欢迎信息和各种功能按钮。
代码示例如下:
def main_window():
# 创建主界面
root = tk.Tk()
root.title('ATM')
# 欢迎信息
welcome_label = tk.Label(root, text='欢迎使用 ATM!')
welcome_label.pack()
# 各种功能按钮
# 查询余额
def query_balance():
cursor = db.cursor()
sql = 'SELECT balance FROM users WHERE account=%s'
cursor.execute(sql, (account,))
result = cursor.fetchone()
balance = result[0]
tk.messagebox.showinfo('提示', f'您的余额为:{balance}')
query_balance_button = tk.Button(root, text='查询余额', command=query_balance)
query_balance_button.pack()
# 修改密码界面
def change_password_window():
change_password_window = tk.Tk()
change_password_window.title('修改密码')
# 原密码输入框
old_password_label = tk.Label(change_password_window, text='原密码:')
old_password_label.grid(row=0, column=0)
old_password_entry = tk.Entry(change_password_window, show='*')
old_password_entry.grid(row=0, column=1)
# 新密码输入框
new_password_label = tk.Label(change_password_window, text='新密码:')
new_password_label.grid(row=1, column=0)
new_password_entry = tk.Entry(change_password_window, show='*')
new_password_entry.grid(row=1, column=1)
# 确认密码输入框
confirm_password_label = tk.Label(change_password_window, text='确认密码:')
confirm_password_label.grid(row=2, column=0)
confirm_password_entry = tk.Entry(change_password_window, show='*')
confirm_password_entry.grid(row=2, column=1)
# 确认按钮
def confirm():
# 获取输入的密码
old_password = old_password_entry.get()
new_password = new_password_entry.get()
confirm_password = confirm_password_entry.get()
# 验证原密码是否正确
cursor = db.cursor()
sql = 'SELECT * FROM users WHERE account=%s AND password=%s'
cursor.execute(sql, (account, old_password))
result = cursor.fetchone()
# 如果原密码正确,则进行密码修改操作
if result:
if new_password == confirm_password:
cursor.execute('UPDATE users SET password=%s WHERE account=%s', (new_password, account))
db.commit()
tk.messagebox.showinfo('提示', '密码修改成功!')
change_password_window.destroy()
else:
tk.messagebox.showinfo('提示', '新密码和确认密码不一致!')
else:
tk.messagebox.showinfo('提示', '原密码错误!')
confirm_button = tk.Button(change_password_window, text='确认', command=confirm)
confirm_button.grid(row=3, column=0)
change_password_window.mainloop()
change_password_button = tk.Button(root, text='修改密码', command=change_password_window)
change_password_button.pack()
root.mainloop()
接下来,我们可以继续编写其他功能,如取款、存款、查看明细记录、转账等。
完整代码如下:
import tkinter as tk
import pymysql
# 连接数据库
db = pymysql.connect(host='localhost', user='root', password='123456', database='atm', charset='utf8')
# 主界面
def main_window():
root = tk.Tk()
root.title('ATM')
# 欢迎信息
welcome_label = tk.Label(root, text=f'欢迎您,{name}!')
welcome_label.pack()
# 查询余额按钮
def query_balance():
cursor = db.cursor()
sql = 'SELECT balance FROM users WHERE account=%s'
cursor.execute(sql, (account))
result = cursor.fetchone()
balance = result[0]
tk.messagebox.showinfo('提示', f'您的余额为:{balance}元')
query_balance_button = tk.Button(root, text='查询余额', command=query_balance)
query_balance_button.pack()
# 取款界面
def withdraw_window():
withdraw_window = tk.Tk()
withdraw_window.title('取款')
# 取款金额输入框
withdraw_amount_label = tk.Label(withdraw_window, text='取款金额:')
withdraw_amount_label.grid(row=0, column=0)
withdraw_amount_entry = tk.Entry(withdraw_window)
withdraw_amount_entry.grid(row=0, column=1)
# 确认按钮
def confirm():
cursor = db.cursor()
sql = 'SELECT balance FROM users WHERE account=%s'
cursor.execute(sql, (account))
result = cursor.fetchone()
balance = result[0]
withdraw_amount = withdraw_amount_entry.get()
if withdraw_amount.isdigit():
withdraw_amount = int(withdraw_amount)
if balance >= withdraw_amount:
balance -= withdraw_amount
cursor.execute('UPDATE users SET balance=%s WHERE account=%s', (balance, account))
db.commit()
tk.messagebox.showinfo('提示', '取款成功!')
withdraw_window.destroy()
else:
tk.messagebox.showinfo('提示', '余额不足!')
else:
tk.messagebox.showinfo('提示', '请输入正确的金额!')
confirm_button = tk.Button(withdraw_window, text='确认', command=confirm)
confirm_button.grid(row=1, column=0)
withdraw_window.mainloop()
withdraw_button = tk.Button(root, text='取款', command=withdraw_window)
withdraw_button.pack()
# 存款界面
def deposit_window():
deposit_window = tk.Tk()
deposit_window.title('存款')
# 存款金额输入框
deposit_amount_label = tk.Label(deposit_window, text='存款金额:')
deposit_amount_label.grid(row=0, column=0)
deposit_amount_entry = tk.Entry(deposit_window)
deposit_amount_entry.grid(row=0, column=1)
# 确认按钮
def confirm():
cursor = db.cursor()
sql = 'SELECT balance FROM users WHERE account=%s'
cursor.execute(sql, (account))
result = cursor.fetchone()
balance = result[0]
deposit_amount = deposit_amount_entry.get()
if deposit_amount.isdigit():
deposit_amount = int(deposit_amount)
balance += deposit_amount
cursor.execute('UPDATE users SET balance=%s WHERE account=%s', (balance, account))
db.commit()
tk.messagebox.showinfo('提示', '存款成功!')
deposit_window.destroy()
else:
tk.messagebox.showinfo('提示', '请输入正确的金额!')
confirm_button = tk.Button(deposit_window, text='确认', command=confirm)
confirm_button.grid(row=1, column=0)
deposit_window.mainloop()
deposit_button = tk.Button(root, text='存款', command=deposit_window)
deposit_button.pack()
# 查看明细记录界面
def records_window():
records_window = tk.Tk()
records_window.title('明细记录')
# 明细记录列表
records_list = tk.Listbox(records_window, width=40)
records_list.pack()
# 获取明细记录
cursor = db.cursor()
sql = 'SELECT * FROM records WHERE account=%s'
cursor.execute(sql, (account))
results = cursor.fetchall()
for result in results:
records_list.insert(0, result)
records_window.mainloop()
records_button = tk.Button(root, text='查看明细记录', command=records_window)
records_button.pack()
# 转账界面
def transfer_window():
transfer_window = tk.Tk()
transfer_window.title('转账')
# 转账账号输入框
transfer_account_label = tk.Label(transfer_window, text='转账账号:')
transfer_account_label.grid(row=0, column=0)
transfer_account_entry = tk.Entry(transfer_window)
transfer_account_entry.grid(row=0, column=1)
# 转账金额输入框
transfer_amount_label = tk.Label(transfer_window, text='转账金额:')
transfer_amount_label.grid(row=1, column=0)
transfer_amount_entry = tk.Entry(transfer_window)
transfer_amount_entry.grid(row=1, column=1)
# 确认按钮
def confirm():
cursor = db.cursor()
sql = 'SELECT balance FROM users WHERE account=%s'
cursor.execute(sql, (account))
result = cursor.fetchone()
balance = result[0]
transfer_account = transfer_account_entry.get()
transfer_amount = transfer_amount_entry.get()
if transfer_amount.isdig it:
transfer_amount = int(transfer_amount)
if balance >= transfer_amount:
balance -= transfer_amount
cursor.execute('UPDATE users SET balance=%s WHERE account=%s', (balance, account))
cursor.execute('UPDATE users SET balance=balance+%s WHERE account=%s', (transfer_amount, transfer_account))
db.commit()
tk.messagebox.showinfo('提示', '转账成功!')
transfer_window.destroy()
else:
tk.messagebox.showinfo('提示', '余额不足!')
else:
tk.messagebox.showinfo('提示', '请输入正确的金额!')
confirm_button = tk.Button(transfer_window, text='确认', command=confirm)
confirm_button.grid(row=2, column=0)
transfer_window.mainloop()
transfer_button = tk.Button(root, text='转账', command=transfer_window)
transfer_button.pack()
root.mainloop()
if __name__ == '__main__':
main()