Python 从打开函数访问文件而不调用它

Python 从打开函数访问文件而不调用它,python,pandas,tkinter,Python,Pandas,Tkinter,我想访问一个文件,以便以后在Tkinter中使用。该文件由用户选择并由函数打开。该函数由一个按钮调用。如何访问此文件而不再次调用函数,从而再次触发文件选择器 def select_file(): filetypes = ( ('Excel files', '*.xlsx'), ) filename = fd.askopenfilename( title='Open file', initialdir='/', filetypes=filetypes) show

我想访问一个文件,以便以后在Tkinter中使用。该文件由用户选择并由函数打开。该函数由一个按钮调用。如何访问此文件而不再次调用函数,从而再次触发文件选择器

def select_file():
filetypes = (
    ('Excel files', '*.xlsx'),
)

filename = fd.askopenfilename(
    title='Open file',
    initialdir='/',
    filetypes=filetypes)

showinfo(
    title='Selected File',
    message=filename
)
df = pd.read_excel(filename, engine='openpyxl')

return df


open_button = tk.Button(
    root,
    text='Select File',
    command=select_file
)
open_button.pack()

df = select_file()
print(df.head())

我想我可以让它成为函数中的一个全局变量?但看起来不太优雅。我一定错过了什么明显的东西。这是我的第一个Tkinter项目。感谢所有帮助

Tkinter回调的返回值无法访问,因此有些选项是:

  • 全局变量
  • 可变变量,例如列表,然后附加到它
  • 将属性绑定到回调函数
  • 独立组班
第三种选择:

def select_file():
   # ask for it
   file_name = ...

   # bind to function
   select_file.file_name = file_name

# start with None
select_file.file_name = None

# other things...
# e.g., button placement

# somewhere in the program (possibly in a callback), checking the file name
...f_name = select_file.file_name
...if f_name is not None:
      ...

另一件需要注意的事情是,只有在询问用户后,即按下按钮后,文件名才可用。到那时,整个程序被遍历,tkinter mainloop被启动,所以只有tkinter事件被监听。因此,您可以在其中一个回调中使用上述
if

如果您不想使用全局变量,请将相关内容放入类中并使用实例变量。这可能真的很有用。谢谢<代码>选择_文件做得太多。它应该提供给其他人使用的文件名。这不会导致同样的问题吗?当read_excel试图访问f_名称时,将调用select_file函数?至少看起来是这样。当我运行程序时,文件选择器窗口已经打开,在我按下按钮“打开按钮”之前@G\u olof你完全正确,这是一个无用的回答抱歉。。。回调的返回值不能直接到达;因此,一个全局变量
filename
或一个持久结构,例如在函数外部定义的
list
,然后附加到函数内部,或者使文件名成为函数的一个属性,或者一个类本身可能会有所帮助。@G_olof但是,我现在对如何在程序中使用该文件名有点困惑,因为只有当用户被询问时,即只有在按下按钮后,它才可用。到那个时,整个程序被遍历,tkinter主循环被启动,所以只有tkinter事件被监听。你想在另一个tkinter回调函数中使用这个文件名吗?是的,非常感谢你的帮助。它帮助我更好地构建代码。我意识到我可以使用回调函数,而不是使变量成为全局变量,从而实现同样的效果。@G_olof,我明白了;很高兴听到这个消息。FWIW,为了使这个答案至少不会错,我提供了一种可能对某些用例有用的方法。