自助取款机系统(python+mysql+GUI)

这是一个基于Python和wxPython的银行自助服务系统,包括登录、存款、取款、转账、查询交易记录和修改密码等功能。系统利用pymysql进行数据库交互,通过GUI界面提供友好用户体验,支持账户余额查询、交易流水查询,并能处理转账和密码修改操作。用户在登录后可进行各种金融活动,所有操作都会更新到数据库并生成相应的流水订单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用语言:python
核心控件:pymysql (数据库),wxpython(GUI)

主要功能:

登录功能:通过python访问数据库,对用户输入的账号密码进行验证。
存款/取款功能:根据用户登录时输入的账号在card表中进行查找,找到该账号所对应的的信息,如果操作为存款则 余额=余额+(存款金额),如果为取款先判断余额是否大于取款金额,如果大于则 余额=余额+(取款金额),否则操作失败,提示余额不足。
查询交易记录功能:根据用户登录时输入的账号在bill表中查询该账号的交易记录,如果记录为空则提示交易记录为空,否则显示交易记录。
转账功能:在转账界面用户输入目标账号(目标账号不能与自己账号相同)
修改密码功能:根据用户输入的账号,找到card表中该账号的信息,输入账号和确认账号(确保两次输入相同)对该账号的密码进行修改
数据库结构:
在这里插入图片描述

bank表

在这里插入图片描述

bill表结构

在这里插入图片描述

card表结构

在这里插入图片描述

user表结构

在这里插入图片描述

具体实现:

在这里插入图片描述

img文件夹存放GUI设计的背景图片

Deposit 存款功能

import wx
import pymysql
from MySQL import Make_bill,function
import threading
import time
class Deposit1(wx.App):
    def doClose(self,j):
        time.sleep(j)
        self.frame.Close()
    def __init__(self,YuanZhangH):
 
        self.YuanZhangH=YuanZhangH
        wx.App.__init__(self)
        self.frame = wx.Frame(parent=None,title='存 款',size=(535,450),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX )
 
        panel=wx.Panel(self.frame,-1)
        panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
        label_pass = wx.StaticText(panel,-1,"存款金额:", pos=(80,200))
        #style 为设置输入
        self.JinE = wx.TextCtrl(panel,-1, size=(250,35), pos=(140,190))
 
        self.QueDing_button = wx.Button(panel, -1, "确        认", size=(80,60),  pos=(120,280))
        self.QuXiao_button         = wx.Button(panel, -1, "反        回", size=(80, 60), pos=(340,280))
 
        self.QueDing_button.SetBackgroundColour('#0a74f7')
        self.QuXiao_button.SetBackgroundColour('#0a74f7')
 
        self.Bind(wx.EVT_BUTTON, self.CunK, self.QueDing_button)
        self.Bind(wx.EVT_BUTTON, self.QU, self.QuXiao_button)
 
        self.frame.Center()
        self.frame.Show(True)
    def show_message(self,word=""):
        dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
    def show_check(self,word=""):
        dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
    def QU(self,event):
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        jie = function.Jiemian(self.YuanZhangH)
        jie.MainLoop()
 
    def CunK(self,event):
        #连接到本地数据库
 
        z2= self.JinE.GetValue()
        YuanZhangH=self.YuanZhangH
        # sql = """ UPDATE card set 余额=余额+z2 WHERE Card_Number= '%s' """ % (z1)
        sql = "update card set 余额 = 余额+'{}' where Card_Number = '{}'".format(float(z2),YuanZhangH)
 
        #判断,查看用户名和密码名是否为空
        #不为空之后在进行查询和判断
        #不然当密码或用户名为空时会出现会导致出错
        if z2:
            db = pymysql.connect(host="localhost", user="root",
            password="111111", db="银行存款记录数据库", port=3306)
            # 使用cursor()方法获取操作游标
            cur = db.cursor()
            try:
                    cur.execute(sql)  # 执行sql语句
                    db.commit()
                    Make_bill.Make_Bill(YuanZhangH, "存款", float(z2), "无")
                    self.show_check(word='存款成功')
            except Exception as e:
                db.rollback()
 
 
            finally:
 
                db.close()  # 关闭连接
        else:
            self.show_message(word='存款金额不能为空')
 
    def OnEraseBack(self, event):
        dc = event.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        bmp = wx.Bitmap('img\\instagram.jpg')
        dc.DrawBitmap(bmp, 0, 0)

function 功能界面

import wx
from MySQL import transfer,Deposit,Withdrawal,Gaim,Make_bill,Query
import threading,time
class Jiemian(wx.App):
    def doClose(self,j):
        time.sleep(j)
        self.frame.Close()
    def __init__(self,Num):
        wx.App.__init__(self)
        self.Num=Num
        self.frame = wx.Frame(parent=None,title='自助银行',size=(1000,750),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX )
 
        panel=wx.Panel(self.frame,-1)
        # img=wx.Icon(name='logo.png',type=wx.BITMAP_TYPE_PNG)
        # wx.StaticBitmap(panel,-1,bitmap=img,pos=(0,0))
        # image = wx.Image("instagram.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
        panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
        self.Query_transaction_records_button = wx.Button(panel, -1, "查询交易记录", size=(200,60),  pos=(0,250))
        self.transfer_accounts_button         = wx.Button(panel, -1, "转        账", size=(200, 60), pos=(0,375))
        self.deposit    = wx.Button(panel, -1, "存        款", size=(200, 60), pos=(800, 375))
        self.withdrawal = wx.Button(panel, -1, "取        款", size=(200, 60), pos=(800, 250))
        self.gaimi = wx.Button(panel, -1, "改        密", size=(200, 60), pos=(0, 500))
        self.jiaofei = wx.Button(panel, -1, "缴        费", size=(200, 60), pos=(800, 500))
        self.tuichu = wx.Button(panel, -1, "退        卡", size=(200, 60), pos=(800, 625))
 
        self.Bind(wx.EVT_BUTTON, self.qery, self.Query_transaction_records_button)
        self.Bind(wx.EVT_BUTTON, self.transf, self.transfer_accounts_button)
        self.Bind(wx.EVT_BUTTON, self.depos, self.deposit)
        self.Bind(wx.EVT_BUTTON, self.withdraw, self.withdrawal)
        self.Bind(wx.EVT_BUTTON, self.gaim, self.gaimi)
        self.Bind(wx.EVT_BUTTON,self.Tui,self.tuichu)
        self.frame.Center()
        self.frame.Show(True)
    def OnEraseBack(self, event):
        dc = event.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        bmp = wx.Bitmap('img\\功能界面2.jpg')
        dc.DrawBitmap(bmp, 0, 0)
    def transf(self,event):
        Num=self.Num
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        app = transfer.Transfer(Num)
        app.MainLoop()
    def depos(self,event):
        Num=self.Num
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        app = Deposit.Deposit1(Num)
        app.MainLoop()
    def withdraw(self,event):
        Num=self.Num
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        app=Withdrawal.Withdrawal1(Num)
        app.MainLoop()
    def gaim(self,event):
        Num=self.Num
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        app = Gaim.Gaim1(Num)
        app.MainLoop()
    def Tui(self,event):
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
    def qery(self,event):
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        app = Query.Query(self.Num)
        app.MainLoop()
 

Gaim 修改密码功能

import wx
import pymysql,threading,time
from MySQL import function
class Gaim1(wx.App):
    def doClose(self,j):
        time.sleep(j)
        self.frame.Close()
    def __init__(self,YuanZhangH):
 
        self.YuanZhangH=YuanZhangH
        wx.App.__init__(self)
        self.frame = wx.Frame(parent=None,title='修改密码',size=(535,450),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX )
        panel=wx.Panel(self.frame,-1)
        panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
        label_user = wx.StaticText(panel,-1,"密    码:", pos=(80,160))
        label_pass = wx.StaticText(panel,-1,"确认密码:", pos=(80,215))
        self.mim = wx.TextCtrl(panel,-1,size=(250,35), pos=(140,150), style=wx.TE_PASSWORD)
        #style 为设置输入
        self.qmim = wx.TextCtrl(panel,-1, size=(250,35), pos=(140,205), style=wx.TE_PASSWORD)
 
        self.QueDing_button = wx.Button(panel, -1, "修        改", size=(80,60),  pos=(120,280))
        self.QuXiao_button         = wx.Button(panel, -1, "反        回", size=(80, 60), pos=(340,280))
 
        self.QueDing_button.SetBackgroundColour('#0a74f7')
        self.QuXiao_button.SetBackgroundColour('#0a74f7')
 
 
 
        self.Bind(wx.EVT_BUTTON, self.Xiu, self.QueDing_button)
        self.Bind(wx.EVT_BUTTON, self.QU, self.QuXiao_button)
 
        self.frame.Center()
        self.frame.Show(True)
    def show_message(self,word=""):
        dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
    def show_check(self,word=""):
        dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
    def Xiu(self,event):
        YuanZhangH=self.YuanZhangH
        z1 = self.mim.GetValue()
        z2 = self.qmim.GetValue()
        sql = "update card set password = '{}' where Card_Number = '{}'".format(z1, YuanZhangH)
        if z1 and z2:
            db = pymysql.connect(host="localhost", user="root",
            password="111111", db="银行存款记录数据库", port=3306)
            # 使用cursor()方法获取操作游标
            cur = db.cursor()
            try:
                if z1==z2:
                    cur.execute(sql)  # 执行sql语句
                    db.commit()
                    self.show_check(word='密码修改成功')
                    results = cur.fetchall()  # 获取查询的所有记录
                    #返回值是一个元组的形式
                else:
                    self.show_message(word='请确保两次输入密码相同')
 
            except Exception as e:
                db.rollback()
 
 
            finally:
                db.close()  # 关闭连接
        pass
 
    def OnEraseBack(self, event):
        dc = event.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        bmp = wx.Bitmap('img\\instagram.jpg')
        dc.DrawBitmap(bmp, 0, 0)
 
    def QU(self, event):
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        jie = function.Jiemian(self.YuanZhangH)
        jie.MainLoop()

main 程序入口

from MySQL import t1
if __name__=='__main__':
    app = t1.MyApp()
    app.MainLoop()

Make_bill 生成流水订单功能

import random
import time
import pymysql
class Make_Bill():
    def __init__(self,Num,stt,val,Mnum):
        self.Num=Num
        self.stt=stt
        self.val=val
        self.Mnum=Mnum
        self.Make(self.Num)
    def makeid(self):
        return int(random.uniform(10000001,10999999))
    def Make(self,Num):
 
        sql = "SELECT card类型,Card_Number FROM card WHERE Card_Number = %s" % (self.Num)
        db = pymysql.connect(host="localhost", user="root",
                             password="111111", db="银行存款记录数据库", port=3306)
        cur=db.cursor()
        try:
 
            cur.execute(sql)  # 执行sql语句
            results=cur.fetchall()
            print(type(results))
            YH=results[0][0]
            YC=results[0][1]
            tim=time.strftime('%Y-%m-%d %H:%M:%S ',time.localtime(time.time()))
            sql2= "INSERT INTO bill VALUES ('%s',%s, '%s','%s', %s,'%s','%s')" % (tim,self.makeid(),YH, self.stt, self.val,YC,self.Mnum)
            cur.execute(sql2)
            db.commit()
 
        except Exception as e:
            db.rollback()
 
 
        finally:
 
            db.close()  # 关闭连接
 
# MM=Make_Bill("62155504510128","转账",1000,"62155504510112")
 

Query 查询订单功能

import  wx,threading,time
import pymysql
from MySQL import function
class Query(wx.App):
    def doClose(self,j):
        time.sleep(j)
        self.frame.Close()
    def __init__(self,card):
        self.card=card
        wx.App.__init__(self)
        self.frame = wx.Frame(parent=None,title='查询',size=(700,600),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX )
 
        self.panel=wx.Panel(self.frame,-1)
        self.panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
 
        self.tex1 = wx.StaticText(self.panel,-1,  "交易时间              订 单 ID        所属银行   交易类型    交易金额       账户信息              目标账户",pos=(70,220))
        # self.entry_tim = wx.TextCtrl(panel,-1,size=(150,35), pos=(120,120))
        # self.entry_ztim = wx.TextCtrl(panel,-1, size=(150,35), pos=(370,120))
 
        self.button=wx.Button(self.panel,-1,"查   询",size=(100,35),pos=(210,120))
        self.button2 = wx.Button(self.panel, -1, "返   回", size=(100, 35), pos=(400, 120))
        self.sampleList=[]
        self.Bind(wx.EVT_BUTTON,self.Query_transaction_records,self.button)
        self.Bind(wx.EVT_BUTTON, self.QU, self.button2)
        # listBox.SetSelection(3)
        self.frame.Center()
        self.frame.Show(True)
    def QU(self, event):
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        jie = function.Jiemian(self.card)
        jie.MainLoop()
    def Query_transaction_records(self,event):
        sql="SELECT * FROM bill where 银行卡号='{}'" .format(self.card)
 
        db = pymysql.connect(host="localhost", user="root",
                             password="111111", db="银行存款记录数据库", port=3306)
        # 使用cursor()方法获取操作游标
        cur = db.cursor()
        try:
            cur.execute(sql)
            results = cur.fetchall()
            print(len(results))
            sampleList =[]
            # self.sampleList.extend(sample)
            print(self.sampleList)
            if results:
                for i in range(len(results)):
                    wor=""
                    for j in range(len(results[i])):
                        print(results[i][j],end=" ")
                        wor+=str(results[i][j])
                        wor+="       "
                    print("")
                    sampleList.append(wor)
                listBox = wx.ListBox(self.panel, -1, (20, 250), (680, 350), sampleList, wx.LB_SINGLE)
                listBox.SetSelection(3)
            else:
                self.show_message(word="交易记录为空")
        except Exception as e:
            db.rollback()
 
 
        finally:
 
            db.close()  # 关闭连接
 
    def show_message(self,word=""):
        dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
    def OnEraseBack(self, event):
        dc = event.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        bmp = wx.Bitmap('img\\instagram.jpg')
        dc.DrawBitmap(bmp, 0, 0)
 
 
# if __name__ == '__main__':
#     app=Query("62155504510128")
#     app.MainLoop()

t1 登录功能

import wx
import random
import pymysql
import time
import threading
#由于当前对布局管理器不是很熟悉,所系使用的是固定位置,导致窗口拉伸的效果不是很好
from MySQL import function
 
class MyApp(wx.App):
    def doClose(self,j):
        time.sleep(j)
        self.frame.Close()
    def __init__(self):
 
        wx.App.__init__(self)
        self.frame = wx.Frame(parent=None,title='Login',size=(600,460),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX )
        #设置窗口的左上角的图标
        #其中参数type表示图片的类型,还有ico,jpgm等类型
        icon_1 = wx.Icon(name='img\\favicon.png',type=wx.BITMAP_TYPE_PNG)
        self.frame.SetIcon(icon_1)
 
        panel = wx.Panel(self.frame,-1)
        # 向panel中添加图片
        image =wx.Image("img\\Login2.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap()
        panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
        #添加文本输入框
        self.entry_user = wx.TextCtrl(panel,-1,size=(225,35), pos=(150,225))
        #style 为设置输入
        self.entry_pass = wx.TextCtrl(panel,-1, size=(225,35), pos=(150,270), style=wx.TE_PASSWORD)
        #添加按钮
        self.but_login = wx.Button(panel,-1,"登陆", size=(130,50), pos=(140,340))
        self.but_register = wx.Button(panel,-1,"注册", size=(130,50), pos=(297,340))
        #设置按钮的颜色
        self.but_login.SetBackgroundColour("#0a74f7")
        self.but_register.SetBackgroundColour("#282c34")
        #给按钮绑定事件
        self.Bind(wx.EVT_BUTTON,self.on_but_login,self.but_login)
        self.Bind(wx.EVT_BUTTON,self.on_but_register,self.but_register)
 
        self.frame.Center()
        self.frame.Show(True)
    def OnEraseBack(self, event):
        dc = event.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        bmp = wx.Bitmap("img\\Login2.jpg")
        dc.DrawBitmap(bmp, 0, 0)
    #定义一个消息弹出框的函数
    def show_message(self,word=""):
        dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
    def show_que(self,word=""):
        dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            # self.Close(True)
            t = threading.Thread(target=self.doClose, args=(0.5,))
            t.start()
        dlg.Destroy()
 
    def on_but_login(self,event):
        #连接到本地数据库
        user_name = self.entry_user.GetValue()
        pass_word= self.entry_pass.GetValue()
        sql = """select password from card where Card_Number ='%s' """ % (user_name)
        #判断,查看用户名和密码名是否为空
        #不为空之后在进行查询和判断
        #不然当密码或用户名为空时会出现会导致出错
        if user_name and pass_word:
            print(user_name, "   ", pass_word)
            db = pymysql.connect(host="localhost", user="root",
            password="111111", db="银行存款记录数据库", port=3306)
            # 使用cursor()方法获取操作游标
            cur = db.cursor()
            try:
                cur.execute(sql)  # 执行sql语句
                results = cur.fetchall()  # 获取查询的所有记录
                #返回值是一个元组的形式
 
                print(type(results))
                if results:
                    # print(type(results[0][0]))
                    # print(results[0][0])
                    if results[0][0] == int(pass_word):
                        self.show_que(word="登陆成功")
                        jie=function.Jiemian(user_name)
                        jie.MainLoop()
                        # self.page1 = function.Jiemian()
                        # je=Jiemian()
                        # je.MainLoop()
                        # self.AddPage(self.page1, "xxpage")
 
 
                    else:
                        self.show_message(word="密码错误")
 
 
                else:
                    self.show_message(word='用户名不存在')
 
            except Exception as e:
                db.rollback()
 
 
            finally:
 
                db.close()  # 关闭连接
        else:
            self.show_message(word='账号和密码不能为空')
 
 
 
 
    def on_but_register(self,event):
        #类似上上面的查询,只需获取相关内容插入到数据库就可以做出相关的操作
        #内容与上面内容相似,不再经行书写
        pass
 
 
    # je=Jiemian()
    # je.MainLoop()

transfer 转账功能

import wx
import pymysql,time,threading
from MySQL import Make_bill,function
class Transfer(wx.App):
    def doClose(self,j):
        time.sleep(j)
        self.frame.Close()
    def __init__(self,YuanZhangH):
        self.YuanZhangH=YuanZhangH
        wx.App.__init__(self)
        self.frame = wx.Frame(parent=None,title='转 账',size=(535,450),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX )
 
        panel=wx.Panel(self.frame,-1)
        panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
        label_user = wx.StaticText(panel,-1,"账    号:", pos=(80,160))
        label_pass = wx.StaticText(panel,-1,"转账金额:", pos=(80,215))
        self.ZhangHao = wx.TextCtrl(panel,-1,size=(250,35), pos=(140,150))
        #style 为设置输入
        self.JinE = wx.TextCtrl(panel,-1, size=(250,35), pos=(140,205))
 
        self.YanZheng_button = wx.Button(panel, -1, "验证", size=(50, 35), pos=(400, 150))
        self.QueDing_button = wx.Button(panel, -1, "转        账", size=(80,60),  pos=(120,280))
        self.QuXiao_button         = wx.Button(panel, -1, "反        回", size=(80, 60), pos=(340,280))
 
        self.YanZheng_button.SetBackgroundColour('#0a74f7')
        self.QueDing_button.SetBackgroundColour('#0a74f7')
        self.QuXiao_button.SetBackgroundColour('#0a74f7')
 
 
        self.Bind(wx.EVT_BUTTON, self.YanCard, self.YanZheng_button)
 
        self.Bind(wx.EVT_BUTTON, self.ZhuanZhang, self.QueDing_button)
        self.Bind(wx.EVT_BUTTON, self.QU, self.QuXiao_button)
 
        self.frame.Center()
        self.frame.Show(True)
    def show_message(self,word=""):
        dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
    def show_check(self,word=""):
        dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
 
    def QU(self, event):
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        jie = function.Jiemian(self.YuanZhangH)
        jie.MainLoop()
    def YanCard(self,event):
        z1 = self.ZhangHao.GetValue()
        sql = """select 持卡人姓名,card类型 from card where Card_Number ='%s' """ % (z1)
        if z1!=self.YuanZhangH:
            db = pymysql.connect(host="localhost", user="root",
            password="111111", db="银行存款记录数据库", port=3306)
            # 使用cursor()方法获取操作游标
            cur = db.cursor()
            try:
                cur.execute(sql)  # 执行sql语句
                results = cur.fetchall()  # 获取查询的所有记录
                #返回值是一个元组的形式
 
                print(type(results))
                if results:
                    # print(type(results[0][0]))
                    # print(results[0][0])
                    stt="持卡人姓名:"+results[0][0]+"     "+"银行类型:"+results[0][1]
                    self.show_check(stt)
 
                    print(results[0][0],"   ",results[0][1])
                else:
                    self.show_message(word='账号不存在')
 
            except Exception as e:
                db.rollback()
 
 
            finally:
                db.close()  # 关闭连接
        else:self.show_message(word="转账账号不能与自己相同")
 
 
    def ZhuanZhang(self,event):
        #连接到本地数据库
        z1= self.ZhangHao.GetValue()
        z2= self.JinE.GetValue()
        YuanZhangH=self.YuanZhangH
        # sql = """ UPDATE card set 余额=余额+z2 WHERE Card_Number= '%s' """ % (z1)
        sql = "update card set 余额 = 余额+'{}' where Card_Number = '{}'".format(float(z2),z1)
        sql1 = "SELECT 余额 FROM card WHERE Card_Number = %s" % (z1)
        sql2 = "update card set 余额 = 余额-'{}' where Card_Number = '{}'".format(float(z2), YuanZhangH)
        if z1!=self.YuanZhangH:
            if z1 and z2:
                db = pymysql.connect(host="localhost", user="root",
                password="111111", db="银行存款记录数据库", port=3306)
                # 使用cursor()方法获取操作游标
                cur = db.cursor()
                try:
                    cur.execute(sql1)
                    results = cur.fetchall()
                    if results[0][0] >= float(z2):
                        cur.execute(sql)  # 执行sql语句
                        db.commit()
                        cur.execute(sql2)
                        db.commit()
                        Make_bill.Make_Bill(YuanZhangH,"转账",float(z2),z1)
                        self.show_check(word='转账成功')
                    else:
                        self.show_message(word='余额不足')
 
                except Exception as e:
                    db.rollback()
 
 
                finally:
 
                    db.close()  # 关闭连接
            else:
                self.show_message(word='账号和转账金额不能为空')
        else:self.show_message(word="转账账号不能与自己相同")
    def OnEraseBack(self, event):
        dc = event.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        bmp = wx.Bitmap('img\\instagram.jpg')
        dc.DrawBitmap(bmp, 0, 0)
 
# if __name__=='__main__':
#     app = Transfer("62155504510128")
#     app.MainLoop()

withdraw 取款功能

import wx
import pymysql,time,threading
from MySQL import Make_bill,function
class Withdrawal1(wx.App):
    def doClose(self,j):
        time.sleep(j)
        self.frame.Close()
    def __init__(self,YuanZhangH):
        self.YuanZhangH=YuanZhangH
        wx.App.__init__(self)
        self.frame = wx.Frame(parent=None,title='取 款',size=(535,450),style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX )
 
        panel=wx.Panel(self.frame,-1)
        panel.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
        label_pass = wx.StaticText(panel,-1,"取款金额:", pos=(80,200))
        #style 为设置输入
        self.JinE = wx.TextCtrl(panel,-1, size=(250,35), pos=(140,190))
 
        self.QueDing_button = wx.Button(panel, -1, "确        认", size=(80,60),  pos=(120,280))
        self.QuXiao_button         = wx.Button(panel, -1, "反        回", size=(80, 60), pos=(340,280))
 
        self.QueDing_button.SetBackgroundColour('#0a74f7')
        self.QuXiao_button.SetBackgroundColour('#0a74f7')
 
        self.Bind(wx.EVT_BUTTON, self.QuK, self.QueDing_button)
        self.Bind(wx.EVT_BUTTON, self.QU, self.QuXiao_button)
        self.frame.Center()
        self.frame.Show(True)
    def show_message(self,word=""):
        dlg = wx.MessageDialog(None, word, u"错误", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
    def show_check(self,word=""):
        dlg = wx.MessageDialog(None, word, u"提示", wx.YES_NO | wx.ICON_QUESTION)
 
        if dlg.ShowModal() == wx.ID_YES:
            #self.Close(True)
            pass
        dlg.Destroy()
 
    def QuK(self, event):
        # 连接到本地数据库
        z2 = self.JinE.GetValue()
        YuanZhangH = self.YuanZhangH
        sql1 = "SELECT 余额 FROM card WHERE Card_Number = %s" % (YuanZhangH)
        sql2 = "update card set 余额 = 余额-'{}' where Card_Number = '{}'".format(float(z2), YuanZhangH)
        # 判断,查看用户名和密码名是否为空
        # 不为空之后在进行查询和判断
        # 不然当密码或用户名为空时会出现会导致出错
        if z2:
            db = pymysql.connect(host="localhost", user="root",
                                 password="111111", db="银行存款记录数据库", port=3306)
            # 使用cursor()方法获取操作游标
            cur = db.cursor()
            try:
                cur.execute(sql1)
                results = cur.fetchall()
                if results[0][0] >= float(z2):
                    cur.execute(sql2)
                    db.commit()
                    Make_bill.Make_Bill(YuanZhangH, "取款", float(z2), "无")
                    self.show_check(word='取款成功')
                else:
                    self.show_message(word='余额不足')
 
            except Exception as e:
                db.rollback()
            finally:
 
                db.close()  # 关闭连接
        else:
            self.show_message(word='取款金额不能为空')
 
    def OnEraseBack(self, event):
        dc = event.GetDC()
        if not dc:
            dc = wx.ClientDC(self)
            rect = self.GetUpdateRegion().GetBox()
            dc.SetClippingRect(rect)
        dc.Clear()
        bmp = wx.Bitmap('img\\instagram.jpg')
        dc.DrawBitmap(bmp, 0, 0)
 
    def QU(self, event):
        t = threading.Thread(target=self.doClose, args=(0.05,))
        t.start()
        jie = function.Jiemian(self.YuanZhangH)
        jie.MainLoop()

效果:

登录界面

在这里插入图片描述

功能板界面

在这里插入图片描述

查询界面

在这里插入图片描述

存/取款界面

在这里插入图片描述

转账界面

在这里插入图片描述

改密界面

在这里插入图片描述

小编特别提示

具体页面布局和ui特别丑,小编不是专业的UI设计为了实现效果,可以根据自己的设计修改想要的页面。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江東-H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值