鱼C论坛

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

[已解决]被35讲中的一道课后题卡住了,求大神解答

[复制链接]
发表于 2018-2-18 15:13:59 | 显示全部楼层 |阅读模式

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

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

x
问题是这个 微信图片_20180218150934.png

然后我写的代码是这样:
import easygui as g
import sys
import os

file_path = g.fileopenbox()
old_file = open(file_path)

msg = '文件的内容如下:'
change_file = g.textbox(msg,title = '显示文件内容',text = (old_file.read()))

old_file.close()

if old_file != change_file:
    save = g.buttonbox(msg='检测到文件内容发生改变,请选择以下操作:',title='警告',choices=('覆盖保存','放弃保存','另存为'))
    if save == '覆盖保存':
        f = open(file_path,'w')
        f.write(change_file)
        f.close()
    elif save =='放弃保存':
         pass
    elif save =='另存为':
        file_save_path = g,filesavebox()
        os.mkdir(file_save_path)
        f = open(file_save_path,'w')
        f.write(change_file)
        f.close()



本人基础实在太差,有很多细节方面的基础错误都不懂,现在一直报错,而且个人发现没有对原文进行任何改动都会进入第一个if条件当中,希望有大神能帮我揪一揪代码中所有的错误用法,十分感谢!
最佳答案
2018-2-26 20:07:46
本帖最后由 laurence5181 于 2018-2-26 20:19 编辑
import easygui as g
import sys
import os

file_path = g.fileopenbox()
old_file = open(file_path)

msg = '文件的内容如下:'
title = '显示文件内容'
text = old_file.read()

change_file = g.textbox(msg, title ,text)

old_file.close()

if text != change_file:      #比較的是文檔"內容(text)" 而不是old_file
    save = g.buttonbox(msg='检测到文件内容发生改变,请选择以下操作:',title='警告',choices=('覆盖保存','放弃保存','另存为'))
    if save == '覆盖保存':
        f = open(file_path,'w')
        f.write(change_file)
        f.close()
    elif save =='放弃保存':
         pass
    elif save =='另存为':
        file_save_path = g,filesavebox()
        os.mkdir(file_save_path)
        f = open(file_save_path,'w')
        f.write(change_file)
        f.close()

1.比較對像錯誤
不管怎樣一定都會進入if判斷 因為程式是由上往下一行一行執行的 (可以去溫習小甲魚007~009 了不起的分支與循環)
我猜你的疑問應該是為什麼沒修改內容還是會跳出詢問儲存框
因為你原本比較的是file對像(open()把文件變為對像)跟textbox回傳的文件內容字符串  
所以不管怎麼比較一定都會進入if的循環(因為不等於)

只要把if old_file 改成 text就能正確執行了!

2.注意參數位置
change_file = g.textbox(msg,title ,text)
這邊你原本是用關鍵字參數的形式,我把他改成這樣是因為這邊有個需要注意的地方
參數的順序 位置參數>關鍵字參數>默認參數

假如我改成change_file = g.textbox(msg,title = '显示文件内容', text)
他會報錯"positional argument follows keyword argument"
因為關鍵字參數後面不能有位置參數!

3.局部參數問題
change_file = g.textbox(msg,title = '显示文件内容', text = (old_file.read()))
text這樣屬於textbox的局部參數(不能被外面所調用)
這樣執行的話 if判斷那邊會報錯NameError: name 'text' is not defined

基本上會遇到這三個問題點(我自己實作的時候也是)
希望有幫助到您理解  若講解有誤也請其他大大指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-26 20:07:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 laurence5181 于 2018-2-26 20:19 编辑
import easygui as g
import sys
import os

file_path = g.fileopenbox()
old_file = open(file_path)

msg = '文件的内容如下:'
title = '显示文件内容'
text = old_file.read()

change_file = g.textbox(msg, title ,text)

old_file.close()

if text != change_file:      #比較的是文檔"內容(text)" 而不是old_file
    save = g.buttonbox(msg='检测到文件内容发生改变,请选择以下操作:',title='警告',choices=('覆盖保存','放弃保存','另存为'))
    if save == '覆盖保存':
        f = open(file_path,'w')
        f.write(change_file)
        f.close()
    elif save =='放弃保存':
         pass
    elif save =='另存为':
        file_save_path = g,filesavebox()
        os.mkdir(file_save_path)
        f = open(file_save_path,'w')
        f.write(change_file)
        f.close()

1.比較對像錯誤
不管怎樣一定都會進入if判斷 因為程式是由上往下一行一行執行的 (可以去溫習小甲魚007~009 了不起的分支與循環)
我猜你的疑問應該是為什麼沒修改內容還是會跳出詢問儲存框
因為你原本比較的是file對像(open()把文件變為對像)跟textbox回傳的文件內容字符串  
所以不管怎麼比較一定都會進入if的循環(因為不等於)

只要把if old_file 改成 text就能正確執行了!

2.注意參數位置
change_file = g.textbox(msg,title ,text)
這邊你原本是用關鍵字參數的形式,我把他改成這樣是因為這邊有個需要注意的地方
參數的順序 位置參數>關鍵字參數>默認參數

假如我改成change_file = g.textbox(msg,title = '显示文件内容', text)
他會報錯"positional argument follows keyword argument"
因為關鍵字參數後面不能有位置參數!

3.局部參數問題
change_file = g.textbox(msg,title = '显示文件内容', text = (old_file.read()))
text這樣屬於textbox的局部參數(不能被外面所調用)
這樣執行的話 if判斷那邊會報錯NameError: name 'text' is not defined

基本上會遇到這三個問題點(我自己實作的時候也是)
希望有幫助到您理解  若講解有誤也請其他大大指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-26 20:50:27 | 显示全部楼层
如果一直进入到if判断语句块中,很简单,你把old_file和change_file的类型print出来,一目了然,old_file是<class '_io.TextIOWrapper'>,change_file是<class 'str'>,当然不会相等啊,所以一直都会提示。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-27 11:58:13 | 显示全部楼层
laurence5181 发表于 2018-2-26 20:07
1.比較對像錯誤
不管怎樣一定都會進入if判斷 因為程式是由上往下一行一行執行的 (可以去溫習小甲魚007 ...

谢谢你讲得很详细,但是old_file已经read()了,old_file里面的内容不是已经清空了嘛,那比较old_file好像不太对了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-27 13:05:13 | 显示全部楼层
你看下,我只改动了读取的变量
import easygui as g
import sys
import os

file_path = g.fileopenbox()
old_file = open(file_path)
text1 = old_file.read()
print(text1)

msg = '文件的内容如下:'
change_file = g.textbox(msg,title = '显示文件内容',text = text1)

old_file.close()

if text1 != change_file:
    save = g.buttonbox(msg='检测到文件内容发生改变,请选择以下操作:',title='警告',choices=('覆盖保存','放弃保存','另存为'))
    if save == '覆盖保存':
        f = open(file_path,'w')
        f.write(change_file)
        f.close()
    elif save =='放弃保存':
         pass
    elif save =='另存为':
        file_save_path = g,filesavebox()
        os.mkdir(file_save_path)
        f = open(file_save_path,'w')
        f.write(change_file)
        f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-27 14:19:07 | 显示全部楼层
本帖最后由 laurence5181 于 2018-2-27 14:20 编辑
不想呆在桂平 发表于 2018-2-27 11:58
谢谢你讲得很详细,但是old_file已经read()了,old_file里面的内容不是已经清空了嘛,那比较old_file好像 ...


因為你把read()所回傳的字符串給了text 所已是比較text跟change_file
不是比較old_file哦  old_file是文件對象
詳細可以參考:http://www.runoob.com/python/python-func-open.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-1 22:00:03 | 显示全部楼层
laurence5181 发表于 2018-2-27 14:19
因為你把read()所回傳的字符串給了text 所已是比較text跟change_file
不是比較old_file哦  old_file是 ...

弄清楚了~谢谢你哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 02:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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