【问题标题】:Access a file from an opening function without calling it从打开函数访问文件而不调用它
【发布时间】:2021-08-26 06:50:04
【问题描述】:

我想访问一个文件以供以后在 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 项目。任何和所有的帮助表示赞赏

【问题讨论】:

  • 如果你不想使用全局变量,把相关的东西放在一个类中并使用实例变量。
  • 这可能是真的。谢谢!
  • select_file 做的太多了。它应该提供文件名供else 使用。

标签: python pandas tkinter


【解决方案1】:

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 主循环,所以只有 tkinter 事件被监听。因此,您可以在其中一个回调中使用上述if

【讨论】:

  • 不会导致同样的问题吗?当 read_excel 尝试访问 f_name 时,会调用 select_file 函数吗?至少看起来是这样。当我运行程序时,文件选择器窗口已经打开,在我按下按钮“open_button”之前
  • @G_olof 你说得对,这是一个无用的答案,抱歉……无法直接达到回调的返回值;因此,全局变量 filename 或诸如 list 之类的持久结构在函数外部定义然后附加在内部,或者使文件名成为函数的属性,或者单独的类可能会有所帮助。
  • @G_olof 但是,我现在对您想如何在程序中使用该文件名有点困惑,因为它只能在用户被询问一次时使用,即仅在按下按钮后。到那时,整个程序都被遍历并启动了 tkinter 主循环,因此只监听 tkinter 事件。所以你想在另一个 tkinter 回调函数中使用文件名吗?
  • 是的,非常感谢您的帮助。它帮助我更好地构建我的代码。我意识到我可以使用回调函数而不是使变量成为全局变量并实现相同的目标。
  • @G_olof 我明白了;听起来还不错。 FWIW,为了让这个答案至少没有错,我提供了一种可能对某些用例有用的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 2015-10-05
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多