python tkinter图形界面代码统计工具


Posted in Python onSeptember 18, 2019

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

#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

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

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=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=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
 
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

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) #删除显示文本框中,原有的内容
 
 for path in pathlist.split(";"):
  path=path.strip()
  codes,code_dict,space,annotation=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) #创建标签
label= 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)

hi_there= Button(frame ,text=" 提交 ",font=("宋体",13),width=10,command=show).grid(row=3,column=0,padx=15,pady=5) #创建按钮
hi_there= 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("e:\\save.txt",'w') as fp:
  fp.write(savecount)
 tkinter.messagebox.showinfo('提示',"结果已保存")

def history():
 if os.path.exists("e:\\save.txt"):
  with open("e:\\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:田川")

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_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)
#以上都是菜单栏的设置
"""
def caidan(root):
 menu=tkinter.Menu(root)
 submenu1=tkinter.Menu(menu,tearoff=0)
 menu.add_cascade(label='查看',menu=submenu1)
 submenu2 = tkinter.Menu(menu, tearoff=0)
 submenu2.add_command(label='复制')
 submenu2.add_command(label='粘贴')
 menu.add_cascade(label='编辑',menu=submenu2)
 submenu = tkinter.Menu(menu, tearoff=0)
 submenu.add_command(
 ='查看帮助')
 submenu.add_separator()
 submenu.add_command(label='关于计算机')
 menu.add_cascade(label='帮助',menu=submenu)
 root.config(menu=menu)

caidan(root)"""
root.mainloop() #执行tk!

python tkinter图形界面代码统计工具

python tkinter图形界面代码统计工具

python tkinter图形界面代码统计工具

python tkinter图形界面代码统计工具

python tkinter图形界面代码统计工具

python tkinter图形界面代码统计工具

python tkinter图形界面代码统计工具

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

Python 相关文章推荐
9种python web 程序的部署方式小结
Jun 30 Python
Python中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
Python中实现结构相似的函数调用方法
Mar 10 Python
Django Highcharts制作图表
Aug 27 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
python实现简单http服务器功能
Sep 17 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
python装饰器使用实例详解
Dec 14 Python
你可能不知道的Python 技巧小结
Jan 29 Python
Django 5种类型Session使用方法解析
Apr 29 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 #Python
Python 元组操作总结
Sep 18 #Python
python sorted函数的小练习及解答
Sep 18 #Python
python 默认参数相关知识详解
Sep 18 #Python
python连接PostgreSQL数据库的过程详解
Sep 18 #Python
Python传递参数的多种方式(小结)
Sep 18 #Python
余弦相似性计算及python代码实现过程解析
Sep 18 #Python
You might like
PHP XML备份Mysql数据库
2009/05/27 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP脚本自动识别验证码查询汽车违章
2016/12/20 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
jQuery的remove()方法使用详解
2015/08/11 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
SVG描边动画
2017/02/23 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
跟老齐学Python之print详解
2014/09/28 Python
Python set常用操作函数集锦
2017/11/15 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
行政部主管岗位职责
2013/12/28 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
开工仪式主持词
2014/03/20 职场文书
财产保全担保书范文
2014/04/01 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android