首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用filedialog.askopenfilename()从TkInter Python3中的另一个方法获取所选文件的路由

如何使用filedialog.askopenfilename()从TkInter Python3中的另一个方法获取所选文件的路由
EN

Stack Overflow用户
提问于 2020-08-10 20:23:15
回答 1查看 265关注 0票数 1

我刚刚开始使用TKInter在python 3中使用GUI,我只想打开一个文件,读取它并在另一个excel文件上写入其中的一些列,所以我创建了一个方法来询问我想要读取的文件的路径:

代码语言:javascript
运行
复制
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())

但在那之后我想用

代码语言:javascript
运行
复制
fileToRead = pandas.read_excel(<FILENAME>)

但我不知道如何从UploadAction方法外部访问“文件名”值。

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-10 21:40:25

有几种方法可以做到这一点。

最简单的方法是添加一行:

代码语言:javascript
运行
复制
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‘,并且不希望它是全局的,那么跟踪是什么是非常棘手的。因此,它基本上限制了您在其他任何地方使用“文件名”,而不会造成严重的混乱。

另一种选择是提出一些数据结构,您可以使用这些数据结构来保存稍后使用的信息。这样做的一个常见方法是拥有一个名为“只在全局范围内使用”的字典,这样就不会有任何混淆,然后将信息放入该字典中。示例:

代码语言:javascript
运行
复制
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或清除字典完成这些变量时更容易删除它们。

我经常做的是做一个真正的课程,仅仅是为了保存这类东西。

代码语言:javascript
运行
复制
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-循环中使用这些变量之一或将其称为每个帧,它将比字典方法慢得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63347495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档