实验目标:1)提供一个文件夹浏览框,让用户选择需要打开的文本文件,打开并显示文件内容。

     2)当用户点击“OK”按钮的时候,比较当前文件是否被修改过,如果修改过,则提示“覆盖保存”、“放弃保存”或“另存为”并实现其功能。


import easygui as g
import os
file_path = g.fileopenbox(default="e:/pathonaaa/a/")
with open(file_path) as old_file:
        #with as语句代替了try finally,自带默认close()功能#
        title = os.path.basename(file_path)
        msg="文件【%s】的内容如下:" % title
        text = old_file.read()
        #这个是当前文件打开的内容,注意若文件内有二进制内容,则红字报错#
        text_after = g.textbox(msg,title,text)
        #如果当前文件在输出框里有变化,那么变化的叫text_after,同时原先的old-file文件在后台关闭#
if text != text_after[:-1]:
        #这个是整个程序的精华之处,用这条语句可以检查是否test发生了改变#
        choice = g.buttonbox("检测到文件内容发生改变,请选择以下操作:","警告",("覆盖保存","放弃保存","另存为"))
        if choice == "覆盖保存":
                with open(file_path,"w") as old_file:
                        #以新写入的方式打开当前的文件#
                        old_file.write(text_after)
                        #覆盖写入#
        if choice == "放弃保存":
                pass
        if choice == "另存为":
                another_path = g.filesavebox(default=".txt")
                #先确定了新文件的路径#
                if os.path.splitext(another_path)[1] !=".txt":
                        #如果新的文件没有保存成txt文件的话#
                        another_path +=".txt"
                        #那就在屁股上加上.txt#
                with open(another_path,"w") as new_file:
                        new_file.write(text_after)


============================分割线==============================

if text != text_after[:-1]:

这句话重点分析一下,os里的read()输出是一个大的字符串,那么这个大的"字符串[:-1]"就是一个仅仅少一个最后一个字符而已。

for example:

    AAA="阿斯顿飞过规划局"      #这是一个字符串#

    AAA[:-1]="阿斯顿飞过规划"    #少了那个“局”字#

    所以可见该程序里text哪怕一个字不动也肯定不等于text_after[:-1],但是在程序中真的一个字也不动却不会触发“!=”,明明少了一个字符,为何还是“==”呢?

    原因如下:easygui.textbox函数会在返回的字符串后边追加一个行结束符(“\n”),即print一下就能看见后面多了一个\n,而没有print出来的但是已经被调用的则是单纯的字符串没有\n,如果要比较字符串是否发生了改变我们需要人工的把这个\n给忽略掉。所以说“字符串[-1]”恰好就是这个\n,这里是一个重要的细节。