python+Gui连接数据库实现ATM程序

制作一个ATM程序,功能如下账户登录,用户输入账号和密码,经过验证后可进入主界面“主界面,用户登录后显示欢迎信息,在读界面显示各种功能按钮,如:查询余额、修改密码等,点击备个功能按钮,可进入相应取款、存款、查看明细记录、转账、界面进行操作。“
自行设计数据库和数据表,要求界面美观,功能齐全,可参考现实中 AIM 的功能和界面。
注:要用python+Gui连接数据库。

参考:https://blog.csdn.net/YANSHUOXU/article/details/103567405/

参考一下

首先,我们需要创建一个数据库,并在数据库中创建一张表来存储用户的信息。我们可以使用 Python 的 pymysql 模块来连接数据库。

首先,我们需要在数据库中创建一张表,表的结构如下:

ID姓名账号密码余额
1张三12345123451000
2李四67890678902000

然后,我们需要编写一个登录界面,用户输入账号和密码后,点击“登录”按钮。我们可以使用 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()