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

如何使用filedialog.askopenfilename()从TkInter Python 3中的另一个方法获取所选文件的路由,python,tkinter,Python,Tkinter,我刚刚开始使用TKInter在python 3中使用GUI,我只想打开一个文件,读取它并在另一个excel文件中写入其中的一些列,因此我创建了一个方法来询问我要读取的文件的路径: def UploadAction(event=None): filename = filedialog.askopenfilename() print('Selected: ', filename) lblOriginFile = Label(window, text='Select origin

我刚刚开始使用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方法之外访问值'filename'


多谢各位

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

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

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',并且不希望它是全局的,那么跟踪是什么可能会非常棘手。因此,它基本上限制了您在其他任何地方使用“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())
现在,无论何时,只要您需要该文件信息,就可以调用字典。这需要做更多的工作,也有点难看,但要清楚地表明它是用于全局目的的,就更容易跟踪哪些变量在哪里。 这还有另一个优点,就是存储为变量的所有内容都会保留在内存中,直到不再附加变量名为止。生成一个全局变量基本上意味着内存中的该位将始终有一个名称,并且在程序结束之前它将永远不会被清除。这对于一些小事情或者需要一直存在的事情来说是完全可以的,但是如果你使用了很多全局变量,那么在程序结束之前,你会把内存弄得一团糟。将所有这些变量包装到on dictionary中,当您使用pop或清除dictionary来处理它们时,可以更轻松地删除它们

我经常做的就是上一堂课,真正的目的就是为了掌握这些东西

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循环中使用这些变量之一或每帧调用一次,它将比字典方法慢得多。

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

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

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',并且不希望它是全局的,那么跟踪是什么可能会非常棘手。因此,它基本上限制了您在其他任何地方使用“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())
现在,无论何时,只要您需要该文件信息,就可以调用字典。这需要做更多的工作,也有点难看,但要清楚地表明它是用于全局目的的,就更容易跟踪哪些变量在哪里。 这还有另一个优点,就是存储为变量的所有内容都会保留在内存中,直到不再附加变量名为止。生成一个全局变量基本上意味着内存中的该位将始终有一个名称,并且在程序结束之前它将永远不会被清除。这对于一些小事情或者需要一直存在的事情来说是完全可以的,但是如果你使用了很多全局变量,那么在程序结束之前,你会把内存弄得一团糟。将所有这些变量包装到on dictionary中,当您使用pop或清除dictionary来处理它们时,可以更轻松地删除它们

我经常做的就是上一堂课,真正的目的就是为了掌握这些东西

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循环中使用这些变量之一,或者每帧调用一次,就会减慢dow的速度
n比dictionary方法简单得多。

command=UploadAction立即调用该函数,而不是在单击按钮时调用。您不需要这些括号。^这是正确的,这就是我仅复制OP的codecomand=UploadAction而不是单击按钮时立即调用函数的结果。你不需要那些括号。^这是正确的,这就是我复制OP代码得到的结果。你试过看看open to read and write吗?还有OpenPyXLU有没有试过看一下OpenToRead和write?还有openpyxl