简单 的Python图形界面编程和数据可视化编程:实现一个简单的账本(与MySQL交互)

       最近被新型冠状病毒闹得,门出不去,学校回不了,网络不太行,打游戏总卡,百无聊赖,就想着利用图形界面编程写一个账本,开学要用。

       肯定有人会说为什么不从手机上下一个现成的App,那样多方便。手机上的记账APP我不是没用过,说实话,人家写的非常好,无论是界面还是功能都无可挑剔,但是功能实在是太多了, 我用起来眼花缭乱的,用着用着就乱套了,所以就想自己写一个,只写自己需要的功能,那样用起来会清晰很多。

       一开始就在纠结是用Python写还是用java写,我知道图形界面编程用java是远好于Python的,但是最后我要实现数据可视化的功能,上网查了一下,数据可视化,用java写有点复杂,最后权衡了一下,还是用Python写,毕竟我是一个Python的忠实爱好者,哈哈。

没有进行界面优化,所以不是那么很好看,下面放图:

    

 

       其他的不多说了,都是废话,代码里用到的都是图形界面编程和数据可视化编程的基础知识(现学现用的),网上一搜一大堆,我直接讲解代码,只讲解一个功能,其他的部分有兴趣的朋友可以访问文章底部的链接获取全部代码。

# -*- coding: utf-8 -*-
"""

@author: DELL
"""
import wx
import pymysql
import datetime

class Transfer(wx.Frame):
    def __init__(self,parent,ID,title):
        wx.Frame.__init__(self,parent,ID,title,wx.DefaultPosition,wx.Size(230,250))
        #定义一个BoxSizer,括号里的参数表示竖直放置
        boxOne = wx.BoxSizer(wx.VERTICAL)

        listAccountOne = ['银行卡','微信','余额宝']
        listAccountTwo = ['银行卡','一卡通','微信','余额宝']

        #定义下拉列表
        self.chAccountOne = wx.ComboBox(self,-1,value='银行卡',choices=listAccountOne,size=(65,-1),style=wx.CB_SORT)
        self.chAccountTwo = wx.ComboBox(self,-1,value='一卡通',choices=listAccountTwo,size=(65,-1),style=wx.CB_SORT)

        self.tranMoney = wx.StaticText(self,-1,'金额(元):',size=(60,-1),style=wx.ALIGN_RIGHT)
        #定义可输入文本
        self.tranMoneyDisplay=wx.TextCtrl(self,-1,'',(100,70),(90,-1),style=wx.TE_CENTER)

        #定义不可变文本
        self.From = wx.StaticText(self,-1,'从:',size=(60,-1),style=wx.ALIGN_RIGHT)
        self.To = wx.StaticText(self,-1,'转至:',size=(60,-1),style=wx.ALIGN_RIGHT)

        #定义按钮
        self.submitButton = wx.Button(self,1,'确定',size=(50,20))
        self.clearButton = wx.Button(self,2,'清空',size=(50,20))
        #“提交”按钮绑定函数,实现提交功能
        wx.EVT_BUTTON(self,1,self.submitFunction)
        #“清空”按钮绑定函数,实现清空功能
        wx.EVT_BUTTON(self,2,self.clearFunction)

        #定义一个GridSizer,用来“存放”各个控件
        gs = wx.GridSizer(4,2,0,0)
        #将控件“输入”GridSizer中
        gs.AddMany([self.From,self.chAccountOne,
                    self.To,self.chAccountTwo,
                    self.tranMoney,self.tranMoneyDisplay,
                    self.submitButton,self.clearButton])

        boxOne.Add(gs,1,wx.EXPAND)
        self.SetSizer(boxOne)
        self.Center()

    #提交功能函数
    def submitFunction(self,event):
        #获得“从”下拉框中的内容
        getAccountFrom = self.chAccountOne.GetValue()
        #获得“转至”下拉框中的内容
        getAccountTo = self.chAccountTwo.GetValue()
        #获得转入金额
        getTranMoney = self.tranMoneyDisplay.GetValue()
        #对转入转出账户进行操作的函数
        self.Tran(getAccountFrom,getAccountTo,getTranMoney)
        #将转账情况记账,写入数据库中
        self.Record(getAccountFrom,getAccountTo,getTranMoney)

    #转账记录函数
    def Record(self,getaccountfrom,getaccountto,gettranmoney):
        #获得当前的日期
        time = datetime.datetime.now().strftime('%Y.%m.%d')
        #连接数据库
        db = self.getDBConnection()
        cursor = db.cursor()
        #数据库操作语句
        sql = 'insert into tranrecord values (%s,%s,%s,%s)'
        #执行插入操作
        try:
            cursor.execute(sql,(time,getaccountfrom,getaccountto,gettranmoney))
            db.commit()
        except:
            db.rollback()
        finally:
            db.close()

    #对转入转出账户进行操作的函数
    def Tran(self,getaccountfrom,getaccountto,gettranmoney):
        #定义一个字典,进行对应
        accountDict = {'银行卡':'card','一卡通':'oneCard','微信':'weiXin','余额宝':'yuEBao'}
        #连接数据库
        db = self.getDBConnection()
        cursor = db.cursor()
        #数据库操作语句
        sqlFrom = "select account from assertbreakdown where accountName='"+accountDict[getaccountfrom]+"'"
        sqlTo = "select account from assertbreakdown where accountName='"+accountDict[getaccountto]+"'"
        #执行数据库操作命令
        reCountFrom = cursor.execute(sqlFrom)
        dataFrom = cursor.fetchall()[0][0]
        reCountFrom = cursor.execute(sqlTo)
        dataTo = cursor.fetchall()[0][0]

        #数据操作
        writeDataFrom = float(dataFrom) - float(gettranmoney)
        writeDataTo = float(dataTo) + float(gettranmoney)

        writeDataFrom = str(writeDataFrom)
        writeDataTo = str(writeDataTo)
        #数据库操作语句
        sqlFrom = "update AssertBreakdown set account='%s' where accountName='%s'" % (writeDataFrom,accountDict[getaccountfrom])
        sqlTo = "update AssertBreakdown set account='%s' where accountName='%s'" % (writeDataTo,accountDict[getaccountto])
        #数据写回
        try:
            cursor.execute(sqlFrom)
            db.commit()
            wx.FutureCall(0,self.ShowMessage)
        except:
            db.rollback()

        try:
            cursor.execute(sqlTo)
            db.commit()
        except:
            db.rollback()
        finally:
            db.close()

    def ShowMessage(self):
        wx.MessageBox('转账成功!','提示',wx.OK|wx.ICON_INFORMATION)
        
    #清空功能函数
    def clearFunction(self,event):
        self.tranMoneyDisplay.SetValue('')

    #获取数据库链接
    def getDBConnection(self):
        db = pymysql.connect(host='localhost',user='root',password='',port=3306,db='ledger')
        return db

class MyApp(wx.App):
    def OnInit(self):
        frame = Transfer(None,-1,'转账')
        frame.Show(True)
        return True
#主函数
def TransferMain():
    app = MyApp()
    app.MainLoop()

       看完这段代码后,细心地朋友可能会观察到,每次修改数据库中的数据,我都是先把相应数据取出来,将数据在代码中进行修改,然后在写回数据库中,这样会耗费很多的资源而且非常浪费时间,一开始我也想直接利用sql语句在数据库中进行修改,但是每次修改完后,数据库竟然对我的数据进行四舍五入,直接舍掉了小数点(我定义的类型的确是float),后来上网查了一些办法,都没有解决,最后不得已用了这种笨办法。

      一个小项目,纯属娱乐,肯定有很多bug,如果有些的不对的地方或者有更好的写法,希望各位朋友指教[抱拳]。

完整代码连接(百度网盘):

https://pan.baidu.com/s/1iEzv43L3whh2nJlcnhi9AQ

提取码:

k0ex

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值