Tkinter文件保存对话框获取路径后全局变量未更新问题求助
解决Tkinter中函数内赋值无法影响全局变量的问题
你遇到的问题其实是Python的变量作用域导致的,和“易失变量”没关系~
问题原因
在Python函数内部,如果直接给一个变量赋值(比如你写的fileName = q),Python会默认把这个变量当成局部变量——也就是说,函数里的fileName和你在开头定义的全局fileName是两个完全独立的变量。所以函数内赋值后,局部的fileName有了正确路径,但全局的那个还是初始的空字符串,这就是为什么末尾打印还是空的。
解决方案
这里有两种常用的解决方式:
1. 使用global关键字声明全局变量
在save()函数开头加上global fileName,明确告诉Python:“我要修改的是全局作用域里的那个fileName,不是新建局部变量”。修改后的函数如下:
def save(): global fileName # 声明使用全局变量 myFormats = [ ('Text File','*.txt') ] root = tkinter.Tk() q = tf.asksaveasfilename(parent=root,filetypes=myFormats ,title="Save the image as...") print(type(q)) fileName = q print(fileName) if len(fileName ) > 0: print ("Now saving under %s" % fileName)
这样函数内的赋值就会直接作用于全局的fileName,末尾打印就能得到正确的路径了。
2. 使用可变对象存储值(避免全局变量)
如果你不想用global关键字(全局变量在复杂程序里容易引发副作用),可以用可变对象(比如列表)来存储文件名。因为可变对象在函数内部修改时,不需要声明全局:
# 初始定义改成列表(可变对象) fileName = [""] def save(): myFormats = [ ('Text File','*.txt') ] root = tkinter.Tk() q = tf.asksaveasfilename(parent=root,filetypes=myFormats ,title="Save the image as...") print(type(q)) fileName[0] = q # 修改列表里的元素,不用global print(fileName[0]) if len(fileName[0]) > 0: print ("Now saving under %s" % fileName[0]) # 后面打印的时候也要取列表的第一个元素 print(fileName[0]) mainloop( ) print(fileName[0])
额外小优化
你的代码里在save()函数里新建了一个root = tkinter.Tk()窗口,运行时会弹出一个额外的空白窗口,其实可以直接用已有的master作为对话框的父窗口,避免多余窗口:
def save(): global fileName myFormats = [ ('Text File','*.txt') ] # 直接用master作为父窗口,不用新建root q = tf.asksaveasfilename(parent=master,filetypes=myFormats ,title="Save the image as...") print(type(q)) fileName = q print(fileName) if len(fileName ) > 0: print ("Now saving under %s" % fileName)
内容的提问来源于stack exchange,提问作者DDDAD
相关产品推荐
相关产品推荐

