鱼C论坛

 找回密码
 立即注册
查看: 1509|回复: 6

[已解决]求助,关于python第35课作业easygui

[复制链接]
发表于 2021-5-22 01:59:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import os
import easygui as g

def searchfile(startdir):
    os.chdir(startdir)
    for eachfile in os.listdir(os.curdir):
        TYPE = os.path.splitext(eachfile)[1]
        if os.path.isfile(eachfile) and TYPE in target:
            lines = 0
            for eachline in eachfile:
                lines += 1
            try:
                filenum[TYPE] += 1
            except KeyError:
                filenum[TYPE] = 1
            try:
                filelinenum[TYPE] += lines
            except KeyError:
                filelinenum[TYPE] = lines
        elif os.path.isdir(eachfile):
            searchfile(eachfile)
            os.chdir(os.pardir)
    total = 0
    result = ''
    total2 = ''
    print(filenum)
    print(filelinenum)
    for Type in filelinenum:
        total += filelinenum[Type]
        result += ('%s源文件%d个,源代码%d行\n'% (Type, filenum[Type], filelinenum[Type]))
    total2 = '您目前共累积编写了 %d 行代码,完成进度:%.2f %%\n离 10 万行代码还差 %d 行,请继续努力!' % (total, total / 1000, 100000 - total)      
    g.textbox(total2,'统计结果',result)
   
startdir = g.diropenbox('请输入你想检查代码的地址:','检查代码')
target = ('.py','.cpp')
filenum = {}
filelinenum = {}
searchfile(startdir)
我用以上代码检查我的文件,结果却执行了很多次才全部统计完,按一次OK就执行一次,执行了四五次
C:\Users\Administrator\Desktop\QQ截图20210522014759
C:\Users\Administrator\Desktop\QQ截图20210522014848
后来我把代码换了一下位置
import os
import easygui as g

def searchfile(startdir):
    os.chdir(startdir)
    for eachfile in os.listdir(os.curdir):
        TYPE = os.path.splitext(eachfile)[1]
        if os.path.isfile(eachfile) and TYPE in target:
            lines = 0
            for eachline in eachfile:
                lines += 1
            try:
                filenum[TYPE] += 1
            except KeyError:
                filenum[TYPE] = 1
            try:
                filelinenum[TYPE] += lines
            except KeyError:
                filelinenum[TYPE] = lines
        elif os.path.isdir(eachfile):
            searchfile(eachfile)
            os.chdir(os.pardir)

   
startdir = g.diropenbox('请输入你想检查代码的地址:','检查代码')
target = ('.py','.cpp')
filenum = {}
filelinenum = {}
searchfile(startdir)
total = 0
result = ''
total2 = ''
print(filenum)
print(filelinenum)
for Type in filelinenum:
    total += filelinenum[Type]
    result += ('%s源文件%d个,源代码%d行\n'% (Type, filenum[Type], filelinenum[Type]))
total2 = '您目前共累积编写了 %d 行代码,完成进度:%.2f %%\n离 10 万行代码还差 %d 行,请继续努力!' % (total, total / 1000, 100000 - total)      
g.textbox(total2,'统计结果',result)
结果就执行一次就全部统计完了,求大佬指点一下,为什么会这个样子呢?
C:\Users\Administrator\Desktop\QQ截图20210522015341
最佳答案
2021-5-22 14:44:37

第一个代码你将 g.textbox(total2, '统计结果', result) 等部分代码放入了函数中

而这个函数中有调用函数本身而进行递归操作,导致你每次进入递归都执行了 g.textbox(total2, '统计结果', result) 的部分代码,所以会一直弹窗

而第二个代码是将  g.textbox(total2, '统计结果', result) 那部分代码 放在函数外,所以函数的递归不会影响到该部分代码,只有递归结束后才显示结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-22 01:59:59 | 显示全部楼层
尴尬,图片怎么发哟,我以为是电脑地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-22 02:03:57 | 显示全部楼层
第一段代码
easygui显示内容
您目前共累积编写了 221 行代码,完成进度:0.22 %
离 10 万行代码还差 99779 行,请继续努力!
.cpp源文件19个,源代码221行
shell显示内容
{'.cpp': 19}
{'.cpp': 221}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-22 02:05:53 | 显示全部楼层
第一段代码执行四五次后
easygui显示内容
您目前共累积编写了 1360 行代码,完成进度:1.36 %
离 10 万行代码还差 98640 行,请继续努力!
.cpp源文件19个,源代码221行
.py源文件72个,源代码1139行
shell显示内容
{'.cpp': 19}
{'.cpp': 221}
{'.cpp': 19, '.py': 48}
{'.cpp': 221, '.py': 816}
{'.cpp': 19, '.py': 71}
{'.cpp': 221, '.py': 1126}
{'.cpp': 19, '.py': 72}
{'.cpp': 221, '.py': 1139}
{'.cpp': 19, '.py': 72}
{'.cpp': 221, '.py': 1139}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-22 02:08:37 | 显示全部楼层
第二段代码
easygui显示内容
您目前共累积编写了 1360 行代码,完成进度:1.36 %
离 10 万行代码还差 98640 行,请继续努力!
.cpp源文件19个,源代码221行
.py源文件72个,源代码1139行
shell显示内容
{'.cpp': 19, '.py': 72}
{'.cpp': 221, '.py': 1139}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-22 14:44:37 | 显示全部楼层    本楼为最佳答案   

第一个代码你将 g.textbox(total2, '统计结果', result) 等部分代码放入了函数中

而这个函数中有调用函数本身而进行递归操作,导致你每次进入递归都执行了 g.textbox(total2, '统计结果', result) 的部分代码,所以会一直弹窗

而第二个代码是将  g.textbox(total2, '统计结果', result) 那部分代码 放在函数外,所以函数的递归不会影响到该部分代码,只有递归结束后才显示结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-23 02:55:36 | 显示全部楼层
Twilight6 发表于 2021-5-22 14:44
第一个代码你将 g.textbox(total2, '统计结果', result) 等部分代码放入了函数中

而这个函数中有调用 ...

谢谢老师解答,懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表