Python程序不记得变量

时间:2018-05-03 03:06:00

标签: python

我正在创建一个用户可以上传.csv文件的程序,然后显示内容,然后操作文件,然后将被操纵的文件作为电子邮件的附件发送。

我的问题是,python没有在SortingCSV和UploadAction函数中调用'fname'。所以我对显示的.csv文件内容无能为力。

这是我得到的错误:

  

NameError:未定义名称“fname”

def load_file(self):
#Upload a CSV file and display its contents
    fname = askopenfilename(filetypes=(("CSV files", "*.csv"),
                                       ("HTML files", "*.html;*.htm"),
                                       ("All files", "*.*") ))
    print(fname)
    print('The file has been uploaded, contents are displayed below')

    import csv

    with open(fname) as f:
        reader = csv.reader(f)
        for row in reader:
            print(" ".join(row))

def SortingCSV(self):
#Allows user to switch the contents of the file to the desired ings
    print(fname)
    print("Tkinter is easy to use!")

def UploadAction(self):
#Allows user to send the converted file to website

    import smtplib

    content = 'Here is your completed file'
    attach = (fname.csv)
    mail = smtplib.SMTP('smtp.gmail.com',587)
    mail.ehlo()
    mail.starttls()
    mail.login('[insert email]','[insert password]')

mail.sendmail('[insert email]','[insert recipient]',content)

    mail.close()    
    print("The file has been sent to your inbox")        

if __name__ == "__main__":
    MyFrame().mainloop()

3 个答案:

答案 0 :(得分:2)

global fname添加为使用该变量的所有函数的第一行。这将使fname成为全局可见变量。但是,全局变量是邪恶的。更好的解决方案是将所有GUI功能打包成一个类。

答案 1 :(得分:1)

你在这里处理的是一个名为变量"范围"。

的东西

对于您来说,脚本是一个连续的指令列表。但对于Python来说,它是三个迷你脚本,每个脚本以def语句开头,并在缩进返回到原始级别时结束。在这些def语句块中发生了什么(称为函数或方法,取决于它们是否在class块内,并且从代码的摘录中清除)没有对代码的其他部分产生影响。

因此,即使您在代码顶部附近定义fname,它也只存在于load_file()函数内。

假设这个代码真的嵌套在class内(我认为可能是因为引用了self),如果你要将文件名分配给self.fname那么会使fname成为实例变量,可从该类的任何def块(方法)获得。

答案 2 :(得分:0)

您的变量的作用域是声明它的方法,这里是load_file()。如果要在方法之外使用它,请将其声明为类属性[root@localhost ~]# echo "[[TargetString1:SomethingIDontWantAfterColon[[TargetString2]]]]" | grep -Eo '\[\[\w+' | sed 's/\[\[//g' TargetString1 TargetString2 [root@localhost ~]# 。然后,您可以使用self.fname在课堂内使用它。

编辑:我假设你的函数是类方法,因为你使用self.fname作为参数。