我刚刚开始使用TKInter在python 3中使用GUI,我只想打开一个文件,读取它并在另一个excel文件上写入其中的一些列,所以我创建了一个方法来询问我想要读取的文件的路径:
def UploadAction(event=None):
filename = filedialog.askopenfilename()
print('Selected: ', filename)
lblOriginFile = Label(window, text='Select origin file: ')
btnOriginFile = Button(window, text='Origin file: ', command=UploadAction())
但在那之后我想用
fileToRead = pandas.read_excel(<FILENAME>)
但我不知道如何从UploadAction方法外部访问“文件名”值。
非常感谢!
发布于 2020-08-10 21:40:25
有几种方法可以做到这一点。
最简单的方法是添加一行:
def UploadAction(event=None):
global filename
filename = filedialog.askopenfilename()
print('Selected: ', filename)
lblOriginFile = Label(window, text='Select origin file: ')
btnOriginFile = Button(window, text='Origin file: ', command=UploadAction())
该“全局文件名”将使它在函数中使用'filename‘时,它引用的是一个全局变量,您可以在任何地方访问该变量。
尽管如此,还是有很多人对使用全局变量不以为然。如果您以后使用了变量名'filename‘,并且不希望它是全局的,那么跟踪是什么是非常棘手的。因此,它基本上限制了您在其他任何地方使用“文件名”,而不会造成严重的混乱。
另一种选择是提出一些数据结构,您可以使用这些数据结构来保存稍后使用的信息。这样做的一个常见方法是拥有一个名为“只在全局范围内使用”的字典,这样就不会有任何混淆,然后将信息放入该字典中。示例:
my_global_dictionary = {}
def UploadAction(event=None):
global my_global_dictionary
my_global_dictionary['filename'] = filedialog.askopenfilename()
print('Selected: ', filename)
lblOriginFile = Label(window, text='Select origin file: ')
btnOriginFile = Button(window, text='Origin file: ', command=UploadAction())
现在,无论何时您需要该文件信息,您都可以调用字典。这是更多的工作,也更丑陋,但清楚地表明它是用于全局目的,使它更容易跟踪哪些变量在哪里。这还有另一个优点,那就是,您作为变量存储的所有东西都保留在内存中,直到它不再附加变量名为止。创建一个全局变量基本上意味着内存中的该位将始终有一个名称,并且在程序结束之前它将永远不会被清理。这对于任何时候都需要存在的小事情来说是完全没有问题的,但是如果你在使用大量的全局变量,你会在程序结束之前把内存弄得乱七八糟。将所有这些变量都封装在字典中可以使您在通过使用pop或清除字典完成这些变量时更容易删除它们。
我经常做的是做一个真正的课程,仅仅是为了保存这类东西。
class Globals:
filename = None
def UploadAction(event=None):
Globals.filename = filedialog.askopenfilename()
print('Selected: ', filename)
lblOriginFile = Label(window, text='Select origin file: ')
btnOriginFile = Button(window, text='Origin file: ', command=UploadAction())
我认为它看起来漂亮得多,也更容易理解。不过,这比字典慢。字典查找非常快,而点查找则比较慢,所以如果您在嵌套的for-循环中使用这些变量之一或将其称为每个帧,它将比字典方法慢得多。
https://stackoverflow.com/questions/63347495
复制相似问题