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通过yield实现数组全排列的方法
Mar 18 Python
python使用xslt提取网页数据的方法
Feb 23 Python
Python使用线程来接收串口数据的示例
Jul 02 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
pow在python中的含义及用法
Jul 11 Python
详解Django 时间与时区设置问题
Jul 23 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
Python try except异常捕获机制原理解析
Apr 18 Python
python网络编程之五子棋游戏
May 14 Python
python快速安装OpenCV的步骤记录
Feb 22 Python
Python进度条的使用
May 17 Python
聊聊Python String型列表求最值的问题
Jan 18 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
一个好用的分页函数
2006/11/16 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
php合并js请求的例子
2013/11/01 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
php经典趣味算法实例代码
2020/01/21 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
小学六年级学生评语
2014/04/22 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
经营目标责任书
2015/05/08 职场文书
校车司机安全责任书
2015/05/11 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
入党申请书怎么写?
2019/06/11 职场文书