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 相关文章推荐
python图像处理之反色实现方法
May 30 Python
python通过ssh-powershell监控windows的方法
Jun 02 Python
tensorflow构建BP神经网络的方法
Mar 12 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
利用python画出折线图
Jul 26 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
Python基于plotly模块实现的画图操作示例
Jan 23 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
Django基础知识 web框架的本质详解
Jul 18 Python
django Model层常用验证器及自定义验证器详解
Jul 15 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 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打开远程文件的方法和风险及解决方法
2013/11/12 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
js玩一玩WSH吧
2007/02/23 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
js无法获取到html标签的属性的解决方法
2016/07/26 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
js实现密码强度检验
2017/01/15 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
vue父子组件的嵌套的示例代码
2017/09/08 Javascript
解决webpack无法通过IP地址访问localhost的问题
2018/02/22 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
使用axios请求时,发送formData请求的示例
2019/10/29 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
Python restful框架接口开发实现
2020/04/13 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
浅析HTML5 Landmark
2020/09/11 HTML / CSS
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
思想品德自我评价
2014/02/04 职场文书
节水口号标语
2014/06/19 职场文书
地方白酒代理协议书
2014/10/25 职场文书
小学感恩节活动总结
2015/03/24 职场文书
因公司原因离职的辞职信范文
2015/05/12 职场文书
关于Python中*args和**kwargs的深入理解
2021/08/07 Python