为了完成学校的实践,做了一个类似于自助取款机的系统。。。
应用语言: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))
sel