Python | “简易清单(EasyBill)增强版”

正文共: 5741字 2图

预计阅读时间: 15分钟

图文编辑:逻辑熊猫 图片来源:网络与截图 欢迎朋友圈各种姿势转发*^_^*

软件的关键在于,你想用它做什么!

一、展示

前情提要:关于本软件的前生今世可以查看笔者的历史文章《Python | “一个简单的清单软件easybill”》

二、说明

本软件是EasyBill的增强版,在上一版的基础上增加了管理功能,以清单为单位管理清单(待办事件)和记录(完成记录)。实际上这里有两个文件夹(目录)用来存放清单和记录(上一版中是两个文件)。并增加了自动添加时间标签功能。

使用了三个模块:

os:管理目录(文件夹)和文件

easygui:快速搭建窗口应用

datetime:获取日期和时间

三、涉及到的方法说明

os模块,是一个操作系统接口模块,可以执行与操作系统相关的操作,比如新建目录,切换目录等。这里使用到的方法主要有:

os.mkdir() : 创建目录(文件夹)

os.isdir() : 判断name是否为目录(文件夹)

os.exists() : 判断名字是否存在(可能是文件,也可能是文件夹)

os.chdir():切换目录(文件夹)

有如下代码:

def cd(self, dst = None):
        if dst == self.bil :
            os.chdir(self.affairs)
        if dst == self.rec :
            os.chdir(self.records)

    def exist(self):
        if not op.exists(self.affairs) or not op.isdir(self.affairs) :
            try:
                os.mkdir(self.affairs)
            except:
                pass
        else:
            pass
        if not op.exists(self.records) or not op.isdir(self.records):
            try:
                os.mkdir(self.records)
            except:
                pass
        else:
            pass

用来改变当前目录,以及用来创建文件夹(目录),前面提到,使用两个文件夹来存放清单和记录单,如果这两个文件夹不存在,就创建这两个文件夹,如果存在,就继续程序。这个的except是个保险。exists不会主动去分辨名字是文件还是文件夹。

datetime模块,是一个日期时间管理模块,利用这模块来获取日期和时间,这里涉及到的方法和属性主要有:

datetime.datetime.today():这个方法可以返回当前系统的时间和日期

>>> import datetime
>>> datetime.datetime.today()
datetime.datetime(2018, 5, 19, 20, 29, 14, 394768)

datetime.datetime.today().weekday():返回当前日期的星期,其中0代表星期日。

这里建立一个列表用来存放对应的字符串。获取日期时间的代码如下:

weekdays = ["Sun", "Mon","Tue","Wed","Thu","Fri","Sat"]
def getdatetime(): # get datetime
    today = datetime.datetime.today()
    year, month, day = today.year, today.month, today.day
    hour, minute, second = today.hour, today.minute, today.second
    weekday = weekdays[today.weekday()]
    return str(year)+"/"+str(month)+"/"+str(day)+' '+weekday+' '+str(hour)+":"+str(minute)

easygui模块,在tkinter基础上开发的建议GUI模块,这里用的方法主要有:

easygui.enterbox():用来获取输入信息

easygui.msgbox() :用来弹出消息框

easygui.choicebox():用来显示选项

easygui.textbox():显示文本内容

四、全部代码

import os
import datetime
import easygui as eg
import os.path as op

weekdays = ["Sun", "Mon","Tue","Wed","Thu","Fri","Sat"]
def getdatetime(): # get datetime
    today = datetime.datetime.today()
    year, month, day = today.year, today.month, today.day
    hour, minute, second = today.hour, today.minute, today.second
    weekday = weekdays[today.weekday()]
    return str(year)+"/"+str(month)+"/"+str(day)+' '+weekday+' '+str(hour)+":"+str(minute)

# main class
class Bill():

    def __init__(self) :
        self.affairs = '待办事件'
        self.records = '完成记录'
        self.bil = '清单'
        self.rec = '记录单'
        self.item = '事件'
        self.recd = '记录'
        self.title = 'EasyBill'

    def cd(self, dst = None):
        if dst == self.bil :
            os.chdir(self.affairs)
        if dst == self.rec :
            os.chdir(self.records)

    def exist(self):
        if not op.exists(self.affairs) or not op.isdir(self.affairs) :
            try:
                os.mkdir(self.affairs)
            except:
                pass
        else:
            pass
        if not op.exists(self.records) or not op.isdir(self.records):
            try:
                os.mkdir(self.records)
            except:
                pass
        else:
            pass
        
    # 创建新清单和创建新记录
    def makebill(self, kind = None):
        
        self.cd(kind)
        
        newbill = eg.enterbox('给新'+ kind + '取个名字吧^_^ ',self.title)
        if not op.exists(newbill):
            f = open(newbill, 'w')
            f.close()
            if op.exists(newbill):
                eg.msgbox('成功新'+ kind + "\"" + newbill+ "\""+'!',"EasyBill")
        else:
            eg.msgbox(kind + "\"" + newbill + "\""+'已存在!',"EasyBill")

        os.chdir('..')
            
    # 修改清单内容或修改记录内容
    def modifybill(self, kind = None):
        self.cd(kind)
        typefile = eg.choicebox('选择要添加内容的'+ kind,'EasyBill', os.listdir('.'))
        newitem = eg.enterbox('请输入新内容:','EasyBill')
        f = open(typefile, 'a')
        newtime = getdatetime()
        f.write(newtime + ' | ' + newitem+'\n')
        f.close()
        eg.msgbox('新内容\"'+newitem+'\"已添加到'+typefile ,"EasyBill")
        os.chdir('..') 
        

    # 显示清单内容或显示记录内容
    def disbill(self, kind = None):

        self.cd(kind)
        
        typefile = eg.choicebox('选择要显示的'+ kind,'EasyBill', os.listdir('.'))
        f = open(typefile, 'r')
        eg.textbox(typefile, 'EasyBill', f)
        f.close
        os.chdir('..')


    # 删除清单内容或删除记录内容
    def rmitem(self, kind):

        self.cd(kind)
        typefile = eg.choicebox('选择要删除内容的'+ kind,'EasyBill', os.listdir('.'))
        f = open(typefile, 'r')
        lines = []
        for each_line in f:
            lines.append(each_line)
        f.close()
        affair = eg.choicebox('请选择要删除的内容', 'EasyBill', lines)
        lines.remove(affair)
        f = open(typefile, 'w')
        for each in lines:
            f.write(each)
        f.close
        os.chdir('..')

    
    # 删除现存清单或删除现存记录
    def rmbill(self, kind = None):
        
        self.cd(kind)

        rmbn = eg.choicebox('选择要删除的'+ kind,'EasyBill', os.listdir('.'))
        os.remove(rmbn)
        eg.msgbox(kind + '\"'+rmbn+ '\"' + '已删除')
        os.chdir('..')

    # 完成事件,即,将待办事件中的内容搬运到完成记录中
    def finishitem(self):
        self.cd(self.bil)
        typefile = eg.choicebox('选择要完成事件的'+ self.bil,'EasyBill', os.listdir('.'))
        f = open(typefile, 'r')
        lines = []
        for each_line in f:
            lines.append(each_line)
        f.close()
        affair = eg.choicebox('请选择要完成的事件', 'EasyBill', lines)
        newitem = affair.split('|')
        lines.remove(affair)
        f = open(typefile, 'w')
        for each in lines:
            f.write(each)
        f.close()
        os.chdir('..')
        self.cd(self.rec)
        typefile = eg.choicebox('选择要记录内容的'+ self.rec,'EasyBill', os.listdir('.'))
        f = open(typefile, 'a')
        newtime = getdatetime()
        f.write(newtime + ' | ' + newitem[1].strip() +'\n')
        f.close()
        eg.msgbox('新内容\"'+newitem[1].strip()+'\"已添加到'+typefile ,"EasyBill")
        os.chdir('..')

    # 最初,功能选择
    def choosefuncs(self):
        allfuncs = ('创建清单','添加事件','显示事件','完成事件','删除事件','删除清单','创建记录单','添加记录','显示记录','删除记录','删除记录单','退出')
        while True:
            getfunc = eg.choicebox('要做什么呢?','EasyBill', allfuncs)
            if getfunc == '创建清单':
                self.makebill(kind = self.bil)
            elif getfunc == '添加事件':
                self.modifybill(kind = self.bil)
            elif getfunc == '显示事件':
                self.disbill(kind = self.bil)
            elif getfunc == '完成事件':
                self.finishitem()
            elif getfunc == '删除事件':
                self.rmitem(kind = self.bil)
            elif getfunc == '删除清单':
                self.rmbill(kind = self.bil)
            elif getfunc == '创建记录单':
                self.makebill(kind = self.rec)
            elif getfunc == '添加记录':
                self.modifybill(kind = self.rec)
            elif getfunc == '显示记录':
                self.disbill(kind = self.rec)
            elif getfunc == '删除记录':
                self.rmitem(kind = self.rec)
            elif getfunc == '删除记录单':
                self.rmbill(kind = self.rec)
            else:
                eg.msgbox('感谢使用EasyBillv1.1 <^_^>',"EasyBill")
                exit()
    

if __name__ == "__main__":
    eg.msgbox('欢迎使用EasyBillv1.1',"EasyBill")
    t = Bill()
    t.exist()
    t.choosefuncs()

五、代码评价

无论从原理上讲还是从实现上讲都很简单,但是实现的很粗糙,依旧存在未解决的bug,关于这部分内容,作者后续会渐渐解决,也换慢慢增加新的功能。

同时也敬请广大读者共同参与。已上传到Github上。

https://github.com/LogicPanda/easybill.git

原文发布于微信公众号 - 逻辑熊猫带你玩Python(LogicPanda)

原文发表时间:2018-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

工具 | 当python爬虫遇到10060错误

相信做过网站爬虫工作的同学都知道,python的urllib2用起来很方便,使用以下几行代码就可以轻松拿到某个网站的源码: ? 最后通过一定的正则匹配,解析返回...

25790
来自专栏Java帮帮-微信公众号-技术文章全总结

Java模板生成word文档/POI生成Excel【面试+工作】

首先要指出的是,实现的思路和freeMarker差不离,将.doc的文档做相应的转换后转为.ftl文档,其中的变量会以${xxx}来代替,这样就可以

86320
来自专栏FreeBuf

Shodan新手入坑指南

*本文原创作者:xiaix,本文属FreeBuf原创奖励计划,未经许可禁止转载 亲们~黑五 Shodan Membership 只要5刀,你剁手了没? 什么是 ...

58450
来自专栏玄魂工作室

Python黑帽编程1.3 Python运行时与包管理工具

Python黑帽编程1.3 Python运行时与包管理工具 0.1 本系列教程说明 本系列教程,采用的大纲母本为《Understanding Network...

388150
来自专栏北京马哥教育

出了Linux 故障找不到方法?看大牛简单、朴实的解决思路

本文由马哥教育Linux云计算面授班23期学员推荐,转载自互联网,作者为Lis,Linux资深技术专家,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛...

46160
来自专栏钟绍威的专栏

linux常用命令之压缩打包用法选项DEMO注意选项DEMO用法选项用法选项DEMO

DF df – report file system disk space usage 查看文件系统的使用清空 用法 df [-hi] [path]选项-h h...

23290
来自专栏云计算教程系列

如何在Ubuntu 14.04上安装Cassandra并运行单节点集群

Cassandra或Apache Cassandra是一个高度可扩展的开源NoSQL数据库系统,在多节点设置上实现了出色的性能。

27930
来自专栏张戈的专栏

解决Linux下MySQL启动错误Starting MySQL.Manager of pid-file quit without updating file.[FAILED]

上午刚装完 MySQL,启动时报如下错误: Starting MySQL.Manager of pid-file quit without updating f...

39050
来自专栏云计算教程系列

如何在服务器上更改MySQL数据库目录

数据库的大小将会随着时间的推移而增长,有时会超出文件系统的空间。当它们与其余操作系统的部分位于同一分区时,您也可能会遇到I / O争用的问题。RAID,网络块存...

33660
来自专栏java架构师

Hadoop学习6--里程碑式的开始之执行第一个程序wordcount

一、先在HDFS文件系统创建对应的目录,具体如下: 1、待处理文件存放目录  /data/wordcount(之所以创建wordcount,是为了对文件分类,对...

27960

扫码关注云+社区

领取腾讯云代金券