我正在创建一个用户可以上传.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()
答案 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
作为参数。