【问题标题】:Tkinter askopenfilename pathTkinter askopenfilename 路径
【发布时间】:2020-11-11 02:57:20
【问题描述】:

我正在尝试使用一个按钮构建一个 Tkinter UI,用户可以在其中选择一个主文件,并根据该文件中的信息,该脚本将获取有关某些辅助文件的一些信息。选择主文件后,我试图使用主文件的文件路径来获取辅助文件的文件路径。但是,因为我两次调用函数“open_main_file()”,所以我得到两个对话框,用户必须在其中选择主文件两次而不是一次。我该如何规避呢?

我的代码如下所示:

import pandas as pd
from tkinter import *
from os.path import dirname
from tkinter import filedialog

root = Tk()

def open_main_file():
    return filedialog.askopenfilename()

def parse_main_file():
    return pd.read_parquet(open_main_file(), engine='pyarrow')

def get_some_ids():
    return parse_main_file()['some_ids'].iloc[0]

def get_list_of_other_files():
    other_files_path = dirname(dirname(dirname(open_main_file())))
    list_of_other_files = []
    for f in get_some_ids():
        list_of_other_files.append(glob.glob(other_files_path + '/identifier=' + str(f) + '/*'))
    return map(''.join, list_of_other_files)

myButton = Button(root, text='Open File...', command=get_list_of_other_files).pack()
root.mainloop()

【问题讨论】:

  • @Wanja 不正确。如果你想使用它们,你需要导入 Filedialog 和一些其他的,比如 ttk 分开。
  • 当我这样做时,我得到“NameError: name 'filedialog' is not defined”,好像它没有被导入一样
  • @Atlas435 哦,对不起,你是对的。我的坏
  • 请注意:myButton = Button(root, text='Open File...', command=get_list_of_other_files).pack() 会将 myButton 设置为 None,因为方法 pack 不会返回任何内容。我建议删除该方法,然后使用myButton.pack() 调用它以避免将来出现错误
  • 另外,尽量和你的变量名保持一致,把myButton改成my_button

标签: python tkinter


【解决方案1】:

尽量不要在其他函数中使用一个函数。在这种情况下,您在另一次调用一个函数,一次在主代码中调用。这就是为什么您获得文件对话框 2 次的原因。使用返回的项目并将其提供给下一个函数。你可以这样编码:

import pandas as pd
from tkinter import *
from os.path import dirname
from tkinter import filedialog

root = Tk()

def open_main_file(): # This function is not necessary
    return filedialog.askopenfilename()

def parse_main_file(main_file_path):
    return pd.read_parquet(main_file_path, engine='pyarrow')

def get_some_ids(main_file_path):
    return parse_main_file(main_file_path)['some_ids'].iloc[0]

def get_list_of_other_files():
    main_file_path = filedialog.askopenfilename()
    other_files_path = dirname(dirname(dirname(main_file_path)))
    list_of_other_files = []
    for f in get_some_ids(main_file_path):
        list_of_other_files.append(glob.glob(other_files_path + '/identifier=' + str(f) + '/*'))
    return map(''.join, list_of_constituent_files)

myButton = Button(root, text='Open File...', command=get_list_of_other_files).pack()
root.mainloop()

【讨论】:

  • 那行得通。我理解您在回答中的观点,但请您指导我到一个链接,我可以理解它为什么会这样工作?我认为我在函数中的参数如何工作方面缺少一些基本的东西,经过数小时浏览文件和结构后我看不清楚。
  • @FarZadAsG 谢谢。 Atlas435 在您的示例代码中,错误是“def get_list_of_other_files(): file = open_main_file()”,而 FarZadAsG 有“def get_list_of_other_files():main_file_path = filedialog.askopenfilename()”,这几乎是我使用函数时犯的错误作为变量的值。
  • 我想我现在知道问题所在了。 @FarZadAsG 在您上面的工作示例中,结果证明 def open_main_file() 甚至没有必要。所要做的只是将 filedialog.askopenfilename() 分配给正确函数下的变量。
  • @bloo 是的,你是对的。这是没有必要的。我只是想保留代码的整个结构。正如你所看到的,我什至没有在后面的代码中使用该函数。只需输入:main_file_path = filedialog.askopenfilename()
猜你喜欢
  • 2016-05-19
  • 1970-01-01
  • 2015-11-19
  • 2018-12-06
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多