python tkinter图形界面代码统计工具(更新)


Posted in Python onSeptember 18, 2019

本文为大家分享了python tkinter图形界面代码统计工具的更新版,供大家参考,具体内容如下

代码统计工具

修改了导出excel功能,把原来的主文件进行了拆分

code_count_windows.py

#encoding=utf-8
import os,sys,time
from collections import defaultdict
from tkinter import *
import tkinter.messagebox
from tkinter import ttk
from tkinter import scrolledtext
import out_save
import code_count

root= Tk()
root.title("有效代码统计工具") #界面的title

def show(): #当按钮被点击,就调用这个方法
  pathlist=e1.get() #调用get()方法得到在文本框中输入的内容
  file_types=e2.get().lower()

  file_types_list=["py","java"]
  
  if not pathlist:
    tkinter.messagebox.showwarning('提示',"请输入文件路径!")
    return None
  if not file_types:
    tkinter.messagebox.showwarning('提示',"请输入要统计的类型!")
    return None
  #print(type(file_types),file_types)
  if '\u4e00'<=file_types<='\u9fa5' or not file_types in file_types_list: #判断文件类型输入的是否是中文
    tkinter.messagebox.showwarning('错误',"输入统计类型有误!")
    return None

  text.delete(1.0,END) #删除显示文本框中,原有的内容
  
  global code_dict
  for path in pathlist.split(";"):
    path=path.strip()
    codes,code_dict,space,annotation=code_count.code_count(path,file_types) #将函数返回的结果赋值给变量,方便输出
    max_code=max(zip(code_dict.values(),code_dict.keys()))
    #print(codes,code_dict)
    #print("整个%s有%s类型文件%d个,共有%d行代码"%(path,file_types,len(code_dict),codes))
    #print("代码最多的是%s,有%d行代码"%(max_code[1],max_code[0]))
    for k,v in code_dict.items():
      text.insert(INSERT,"文件%s 有效代码数%s\n"%(k,v[0])) #将文件名和有效代码输出到文本框中
    
    text.insert(INSERT,"整个%s下有%s类型文件%d个,共有%d行有效代码\n"%(path,file_types,len(code_dict),codes)) #将结果输出到文本框中
    text.insert(INSERT,"共有%d行注释\n"%(annotation))
    text.insert(INSERT,"共有%d行空行\n"%(space))
    text.insert(INSERT,"代码最多的是%s,有%s行有效代码\n\n"%(max_code[1],max_code[0][0]))
  
frame= Frame(root) #使用Frame增加一层容器
frame.pack(padx=50,pady=40) #设置区域
label= Label(frame,text="路径:",font=("宋体",15),fg="blue").grid(row=0,padx=10,pady=5,sticky=N) #创建标签
labe2= Label(frame,text="类型:",font=("宋体",15),fg="blue").grid(row=1,padx=10,pady=5)
e1= Entry(frame,foreground = 'blue',font = ('Helvetica', '12')) #创建文本输入框
e2= Entry(frame,font = ('Helvetica', '12', 'bold'))
e1.grid(row=0,column=1,sticky=W) #布置文本输入框
e2.grid(row=1,column=1,sticky=W,)
labeltitle=Label(frame,text="输入多个文件路径请使用';'分割",font=("宋体",10,'bold'),fg="red")
labeltitle.grid(row=2,column=1,sticky=NW)
frame.bind_all("<F1>",lambda event:helpinf())
frame.bind_all("<Return>",lambda event:show())
frame.bind_all("<Alt-F4>",lambda event:sys.exit())
frame.bind_all("<Control-s>",lambda event:save())

#print(path,file_types)

button1= Button(frame ,text=" 提交 ",font=("宋体",13),width=10,command=show).grid(row=3,column=0,padx=15,pady=5) #创建按钮
button2= Button(frame ,text=" 退出 ",font=("宋体",13),width=10,command=root.quit).grid(row=3,column=1,padx=15,pady=5)
#self.hi_there.pack()
text = scrolledtext.ScrolledText(frame,width=40,height=10,font=("宋体",15)) #创建可滚动的文本显示框
text.grid(row=4,column=0,padx=40,pady=15,columnspan=2) #放置文本显示框

def save():
  #print(text.get("0.0","end"))
  if not text.get("0.0","end").strip(): #获取文本框内容,从开始到结束
    tkinter.messagebox.showwarning('提示',"还没有统计数据!")
    return None
  savecount=''
  nowtime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) #获取当前时间并格式化输出
  savecount=nowtime+"\n"+text.get("0.0","end")
  with open(file_path+"\save.txt",'w') as fp:
    fp.write(savecount)
  tkinter.messagebox.showinfo('提示',"结果已保存")

def history():
  if os.path.exists(file_path+"\save.txt"):
    with open(file_path+"\save.txt",'r') as fp:  
      historytxt=fp.read()
  tkinter.messagebox.showinfo('历史',historytxt)

def helpinf():
  tkinter.messagebox.showinfo('帮助',"""1.输入您要统计的代码文件路径
2.输入您要统计的代码文件类型
3.保存功能只能保存上次查询的结果
快捷键:
F1        查看帮助
ENTE      提交
Alt-F4     退出
Control-s  保存
                       """)

def aboutinf():
  tkinter.messagebox.showinfo('关于',"您现在正在使用的是测试版本  by:田川")

def out_save_xls(code_dict):
  if not text.get("0.0","end").strip(): #获取文本框内容,从开始到结束
    tkinter.messagebox.showwarning('提示',"还没有统计数据!")
    return None
  out_save.out_to_xls(code_dict)
  tkinter.messagebox.showinfo('提示',"结果已导出")

menu=Menu(root)
submenu1=Menu(menu,tearoff=0)
menu.add_cascade(label='查看',menu=submenu1)
submenu1.add_command(label='历史',command=history)
submenu1.add_command(label='保存',command=save)
submenu1.add_command(label='导出',command=lambda :out_save_xls(code_dict))
submenu1.add_separator()
submenu1.add_command(label='退出', command=root.quit)
submenu2=Menu(menu,tearoff=0)
menu.add_cascade(label='帮助',menu=submenu2)
submenu2.add_command(label='查看帮助',command=helpinf)
submenu2.add_command(label='关于',command=aboutinf)
root.config(menu=menu)
#以上都是菜单栏的设置

root.mainloop() #执行tk

code_count.py

#encoding=utf-8
import os,sys
import file_count

def code_count(path,file_types):
  if os.path.exists(path):
    os.chdir(path)
  else:
    #messagebox.showwarning("您输入的路径不存在!")
    print("您输入的路径不存在!")
    #sys.exit()
  
  files_path=[]
  file_types=file_types.split()
  line_count=0
  space_count=0
  annotation_count=0
  file_lines_dict=dict()
  for root,dirs,files in os.walk(path):
    for f in files:
      files_path.append(os.path.join(root,f))

  for file_path in files_path:
    #print(os.path.splitext(file_path)[1][1:])
    file_type=os.path.splitext(file_path)[1][1:]
    if file_type in file_types:
      if file_type.lower()=="java":
        line_num,space_num,annotation_num=file_count.count_javafile_lines(file_path)
        line_count+=line_num
        space_count+=space_num
        annotation_count+=annotation_num
        file_lines_dict[file_path]=line_num,space_num,annotation_num
      if file_type.lower()=="py":
        line_num,space_num,annotation_num=file_count.count_py_lines(file_path)
        line_count+=line_num
        space_count+=space_num
        annotation_count+=annotation_num
        file_lines_dict[file_path]=line_num,space_num,annotation_num
        #file_info=file_show(line_num,space_num,annotation_num)
        #print(file_info[0])
  return line_count,file_lines_dict,space_count,annotation_count

file_count.py

#encoding=utf-8
import os

def count_py_lines(file_path):
    line_count = 0
    space_count=0
    annotation_count=0
    flag =True
    try:
      fp = open(file_path,"r",encoding="utf-8")
      encoding_type="utf-8"
      for i in fp:
        pass
      fp.close()
    except:
      #print(file_path)
      encoding_type="gbk"

  with open(file_path,"r",encoding=encoding_type,errors="ignore") as fp:
    #print(file_path)
    """try:
      fp.read()
    except:
      fp.close()"""
    for line in fp:      
      if line.strip() == "":
        space_count+=1
      else:
        if line.strip().endswith("'''") and flag == False:
          annotation_count+=1
          #print(line)
          flag = True
          continue
        if line.strip().endswith('"""') and flag == False:
          annotation_count+=1
          #print('结尾双引',line)
          flag = True
          continue
        if flag == False:
          annotation_count+=1
          #print("z",line)
          continue 
        """if flag == False:
          annotation_count+=1
          print("z",line)"""
        if line.strip().startswith("#encoding") \
            or line.strip().startswith("#-*-"):
          line_count += 1
        elif line.strip().startswith('"""') and line.strip().endswith('"""') and line.strip() != '"""':
          annotation_count+=1
          #print(line)
        elif line.strip().startswith("'''") and line.strip().endswith("'''") and line.strip() != "'''":
          annotation_count+=1
          #print(line)
        elif line.strip().startswith("#"):
          annotation_count+=1
          #print(line)
        elif line.strip().startswith("'''") and flag == True:
          flag = False
          annotation_count+=1
          #print(line)
        elif line.strip().startswith('"""') and flag == True:
          flag = False
          annotation_count+=1
          #print('开头双引',line)
        else:
          line_count += 1
  return line_count,space_count,annotation_count

#path=input("请输入您要统计的绝对路径:")
#file_types=input("请输入您要统计的文件类型:")

#print("整个%s有%s类型文件%d个,共有%d行代码"%(path,file_types,len(code_dict),codes))
#print("代码最多的是%s,有%d行代码"%(max_code[1],max_code[0]))

def count_javafile_lines(file_path):
  line_count = 0
  space_count=0
  annotation_count=0
  flag =True
  #read_type=''
  try:
    fp = open(file_path,"r",encoding="utf-8")
    encoding_type="utf-8"
    for i in fp:
      pass
    fp.close()
  except:
    #print(file_path)
    encoding_type="gbk"

  with open(file_path,"r",encoding=encoding_type) as fp:
    #print(file_path)
    for line in fp:      
      if line.strip() == "":
        space_count+=1
      else:
        if line.strip().endswith("*/") and flag == False:
          flag = True
          annotation_count+=1
          continue
        if flag == False:
          annotation_count+=1
          continue
        elif line.strip().startswith('/*') and line.strip().endswith('*/'):
          annotation_count+=1
        elif line.strip().startswith('/**') and line.strip().endswith('*/'):
          annotation_count+=1        
        elif line.strip().startswith("//") and flag == True:
          flag = False
          continue
        else:
          line_count += 1
  return line_count,space_count,annotation_count

out_save.py

#encoding=utf-8
import os,time
from openpyxl import Workbook
from openpyxl import load_workbook

def out_to_xls(file_dict):
  nowtime=time.strftime("%Y-%m-%d %H-%M-%S", time.localtime()) #获取当前时间并格式化输出
  file_path=os.path.dirname(__file__)
  if os.path.exists(file_path+'\out_save.xlsx'):
    #print("y")
    wb=load_workbook(file_path+'\out_save.xlsx')
    ws=wb.create_sheet(nowtime)
    ws['A1']='文件名' #增加表头
    ws['B1']='有效代码'
    ws['C1']='空白行数'
    ws['D1']='注释行数'
  
    for file_name,file_data in file_dict.items(): #循环得到的文件字典
      ws.append([file_name]+list(file_data)) #因为工作表的append方法只能添加一个list,所以把文件名和文件统计数据放在一个list里

    wb.save(file_path+'\out_save.xlsx') #把导出的内容保存到文件目录下
  else:
    #print("no")
    wb=Workbook() #创建一个工作簿
    ws=wb.create_sheet(nowtime,index=0) #新建名称为当前时间的sheet插在开头,方便做统计及记录
    ws['A1']='文件名' #增加表头
    ws['B1']='有效代码'
    ws['C1']='空白行数'
    ws['D1']='注释行数'
  
    for file_name,file_data in file_dict.items(): #循环得到的文件字典
      ws.append([file_name]+list(file_data)) #因为工作表的append方法只能添加一个list,所以把文件名和文件统计数据放在一个list里
    
    wb.remove(wb.get_sheet_by_name("Sheet"))
    wb.save(file_path+'\out_save.xlsx') #把导出的内容保存到文件目录下

本次更新:

1.修改导出功能

2.更新了当不输入路径和类型时点击提交按钮直接退出的问题

更新代码为:

1.out_to_xls方法

#encoding=utf-8
import os,time
from openpyxl import Workbook
from openpyxl import load_workbook

def out_to_xls(file_dict):
  nowtime=time.strftime("%Y-%m-%d %H-%M-%S", time.localtime()) #获取当前时间并格式化输出
  file_path=os.path.dirname(__file__)
  if os.path.exists(file_path+'\out_save.xlsx'):
    #print("y")
    wb=load_workbook(file_path+'\out_save.xlsx')
    ws=wb.create_sheet(nowtime)
    ws['A1']='文件名' #增加表头
    ws['B1']='有效代码'
    ws['C1']='空白行数'
    ws['D1']='注释行数'
  
    for file_name,file_data in file_dict.items(): #循环得到的文件字典
      ws.append([file_name]+list(file_data)) #因为工作表的append方法只能添加一个list,所以把文件名和文件统计数据放在一个list里

    wb.save(file_path+'\out_save.xlsx') #把导出的内容保存到文件目录下
  else:
    #print("no")
    wb=Workbook() #创建一个工作簿
    ws=wb.create_sheet(nowtime,index=0) #新建名称为当前时间的sheet插在开头,方便做统计及记录
    ws['A1']='文件名' #增加表头
    ws['B1']='有效代码'
    ws['C1']='空白行数'
    ws['D1']='注释行数'
  
    for file_name,file_data in file_dict.items(): #循环得到的文件字典
      ws.append([file_name]+list(file_data)) #因为工作表的append方法只能添加一个list,所以把文件名和文件统计数据放在一个list里
    
    wb.remove(wb.get_sheet_by_name("Sheet"))
    wb.save(file_path+'\out_save.xlsx') #把导出的内容保存到文件目录下

python tkinter图形界面代码统计工具(更新)

python tkinter图形界面代码统计工具(更新)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python访问系统环境变量的方法
Apr 29 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
Python进阶-函数默认参数(详解)
May 18 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
python实现可变变量名方法详解
Jul 01 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
Python json格式化打印实现过程解析
Jul 21 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
python游戏开发之pygame实现接球小游戏
Apr 22 Python
python3获取url文件大小示例代码
Sep 18 #Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 #Python
python3使用GUI统计代码量
Sep 18 #Python
django中的图片验证码功能
Sep 18 #Python
python tkinter图形界面代码统计工具
Sep 18 #Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 #Python
Python 元组操作总结
Sep 18 #Python
You might like
php实现的在线人员函数库
2008/04/09 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
javascript 动态创建表格
2015/01/08 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
2020/05/29 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
canvas线条的属性详解
2018/03/27 HTML / CSS
linux面试题参考答案(10)
2016/10/26 面试题
毕业生个人求职信范文分享
2014/01/05 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
医学会议开幕词
2016/03/03 职场文书
关于Redis的主从复制及哨兵问题
2022/06/16 Redis