Python 变量文件名存在时不存在

Python 变量文件名存在时不存在,python,python-3.x,file,save,Python,Python 3.x,File,Save,由于某些原因,我无法让代码正常工作——它向我显示了错误,即变量不存在时,它就不存在了 这是我的密码: 从tkinter进口* 从tkinter导入消息框作为消息 从tkinter导入文件对话框https://pythonspot.com/tk-file-dialogs/ def保存: 全局文件名 try:在这里,如果变量'filename'不存在,我们将请求一个文件名。如果它确实存在,我们将使用它。有点像普通文本编辑器在单击“新建”之前让您保存为相同的文件。 yolo=文件名 德尔约洛 keep

由于某些原因,我无法让代码正常工作——它向我显示了错误,即变量不存在时,它就不存在了

这是我的密码:

从tkinter进口* 从tkinter导入消息框作为消息 从tkinter导入文件对话框https://pythonspot.com/tk-file-dialogs/ def保存: 全局文件名 try:在这里,如果变量'filename'不存在,我们将请求一个文件名。如果它确实存在,我们将使用它。有点像普通文本编辑器在单击“新建”之前让您保存为相同的文件。 yolo=文件名 德尔约洛 keepTheFilename=True 除: keepTheFilename=False 从os.path导入expanduser 主页=扩展用户~ 如果keepTheFilename为True: filename=filedialog.asksaveasfilenamesinitialdir=home,title=Saving file 打印保存到%s%filename,结束=\r\n theText=text.get0.0,end-1chttps://stackoverflow.com/a/14824164/9654083 使用openfilename,w作为文件: theFile.writetheText 打印保存到%s,完成。%文件名 slate.titlefilename def openFile: 从os.path导入expanduser 主页=扩展用户~ filename=filedialog.askopenfilenamesinitialdir=home,title=Select要打开的文件 使用openfilename,r作为文件: text=theFile.read text.delete0.0,结束 text.insertEND,文本 slate.titlefilename def deleteAll: text.delete0.0,结束 石板 删除文件名 def你好: msg.showinfoAbout,slate是一个不错的纯文本编辑器。谢谢使用! Labelslate,text=待办事项:-添加\保留在文件中\而不必反复键入文件名;-复制粘贴函数;-还有更多!。收拾 slate=Tk设置窗口`“slate”现在是窗口的内部名称 slate.titleslate设置窗口`“slate”现在是标题栏中的单词 scrollbar=滚动条Slate,orient=垂直设置滚动条 scrollbar.pack side=右侧,fill=Y垂直 text=Textslate,yscrollcommand=scrollbar.set text.pack scrollbar.config命令=text.yview w=按钮板,文本=保存,命令=保存 w2=按钮板,text=Open,command=openFile w、 packpadx=5,pady=10,侧面=左侧 w2.packpadx=5,pady=10,侧面=左侧 主回路 这是我通过单击“保存”按钮运行“保存”时出现的错误:

File "slateGUI.py", line 17, in save
    with open(filename, "w") as theFile:
UnboundLocalError: local variable 'filename' referenced before assignment
如果添加全局文件名:

有人知道我怎么解决这个问题吗?谢谢

如果发生异常,请保留filename=False。如果keepTheFilename=False,则不会启动If语句,因此不会定义文件名

def save():
    try: # If the exception occurs, keepTheFilename = False
        yolo = filename
        del yolo
        keepTheFilename = True
    except:
        keepTheFilename = False
    from os.path import expanduser
    home = expanduser("~")
    if keepTheFilename is True: # If the exception occurred, this if statement will not be launched, hence filename haven't been defined
        filename = filedialog.asksaveasfilename(initialdir=home, title="Saving file")
    print("Saving to  %s" % filename, end="\r")
    theText = text.get(0.0, "end-1c") #https://stackoverflow.com/a/14824164/9654083
    with open(filename, "w") as theFile:
        theFile.write(theText)
        print("Saving to  %s, done." % filename)
    slate.title(filename)

所以,多亏@AnnZen的精彩回答,我才明白了这一点:

def保存: try:如果发生异常,请保持filename=False yolo=文件名 德尔约洛 keepTheFilename=True 除: keepTheFilename=False 从os.path导入expanduser 主页=扩展用户~ if keepTheFilename不是True:如果发生异常,将不会启动此if语句,因此尚未定义filename filename=filedialog.asksaveasfilenamesinitialdir=home,title=Saving file 其他: 全局文件名 打印保存到%s%filename,结束=\r\n theText=text.get0.0,end-1chttps://stackoverflow.com/a/14824164/9654083 使用openfilename,w作为文件: theFile.writetheText 打印保存到%s,完成。%文件名 slate.titlefilename 逻辑:如果没有定义keepTheFilename,它将请求路径。但是,如果已定义,它将使用else块中的全局文件名保存到该原始路径

全局文件名中有一个语法警告:


非常感谢你

您是否在任何地方定义了文件名?是的,当您保存或打开文件时。但在那之后,就像大多数文本编辑器一样,它不会要求您提供路径,除非您打开其他文件或单击“新建”。所以你现在应该可以看到剩下的了。我会把这个标记为答案,但上面说我只能明天做这似乎不再管用了。SyntaxWarning变成了一个SyntaxError,所以我修复了它,但是现在变量filename在全局范围内不存在……即使我声明了它。
def save():
    try: # If the exception occurs, keepTheFilename = False
        yolo = filename
        del yolo
        keepTheFilename = True
    except:
        keepTheFilename = False
    from os.path import expanduser
    home = expanduser("~")
    if keepTheFilename is True: # If the exception occurred, this if statement will not be launched, hence filename haven't been defined
        filename = filedialog.asksaveasfilename(initialdir=home, title="Saving file")
    print("Saving to  %s" % filename, end="\r")
    theText = text.get(0.0, "end-1c") #https://stackoverflow.com/a/14824164/9654083
    with open(filename, "w") as theFile:
        theFile.write(theText)
        print("Saving to  %s, done." % filename)
    slate.title(filename)
slateGUI.py:16: SyntaxWarning: name 'filename' is assigned to before global declaration
  global filename