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中的socket模块使用代理实例
May 29 Python
Python socket编程实例详解
May 27 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
python matplotlib 在指定的两个点之间连线方法
May 25 Python
Python常用爬虫代码总结方便查询
Feb 25 Python
python3实现钉钉消息推送的方法示例
Mar 14 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
对Django url的几种使用方式详解
Aug 06 Python
Python使用configparser读取ini配置文件
May 25 Python
Python函数参数定义及传递方式解析
Jun 10 Python
使用gunicorn部署django项目的问题
Dec 30 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
Feb 16 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下mysql数据库操作类(改自discuz)
2010/07/03 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
python中的多线程实例教程
2014/08/27 Python
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
用Eclipse写python程序
2018/02/10 Python
python实现小球弹跳效果
2019/05/10 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
橄榄树药房:OLIVEDA
2019/09/01 全球购物
瑞典多品牌连锁店:Johnells
2021/01/13 全球购物
车间组长岗位职责
2013/12/20 职场文书
新学期决心书
2014/03/11 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
收费员岗位职责
2015/02/14 职场文书
python操作xlsx格式文件并读取
2021/06/02 Python
浅谈Python协程asyncio
2021/06/20 Python
一文搞懂Python Sklearn库使用
2021/08/23 Python