为了完成学校的实践,做了一个类似于自助取款机的系统。。。
应用语言: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()
效果:
登录界面
功能板界面
查询界面
存/取款界面
转账界面
改密界面
具体实现就是这样,界面挺丑的。。。。