如何记住“askopenfilenames”和“askdirectory”的路径?

How can I remember the paths of 'askopenfilenames' & 'askdirectory'?

提问人:Radu Mitroi 提问时间:10/4/2023 更新时间:10/5/2023 访问量:32

问:

我正在为使用 Python 和 Tkinter 的 Substance Designer 编写一个自定义脚本。它的主要思想是,一旦用户按下按钮,它就会打开一个窗口,要求你选择你需要的文件 -> [处理事情发生] ->最后打开另一个窗口,询问你要保存处理的文件的目录。

我面临的问题是,每当我想重复此过程时,第一个窗口(要求我选择文件的窗口)会在我去过的最后一个地方(我将文件保存到的目录)打开。 当第二个窗口弹出时,也会发生同样的事情,它会在我去过的最后一个地方(我从中选择文件的目录)打开。

我想发生的是,每个窗口弹出窗口始终打开到发生特定功能的路径。 因此,每当重复此过程时,第一个窗口应直接打开,其中包含用户从中选择文件的路径,第二个窗口应直接打开,其中包含用户上次保存这些文件的路径。

我现在处理这些函数的方式非常简单,通过使用:

fileNames = fd.askopenfilenames(parent=root, title='Choose your files')

folder_selected = fd.askdirectory()

其中 fileNames 是要求您选择文件的窗口,folder_selected 是用户希望将这些已处理的文件保存到的位置。

关于如何为这些函数实现某种“内存”的东西,并让脚本执行我上面解释的任何事情的任何想法?

python 文件 tkinter 目录

评论

0赞 Michael Butscher 10/4/2023
这些函数支持一个参数,用于设置对话框应开始的目录。initialdir

答:

2赞 nokla 10/4/2023 #1

您可以使用 initialdir 参数来设置 的初始目录。filedialog

将第一个打开的目录保存到一个变量中,将第二个打开的目录保存到另一个变量中,并在参数中相应地使用这些目录。filedialogfiledialoginitialdir

您可以使用以下模块:os

os.path.dirname("Your Path")

编辑

您可以使用类并根据需要设置实例/类变量。下面是一个简单的示例:

import tkinter as tk
from tkinter import filedialog
import os

class FileSelectorApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.src_files = None
        self.dst_files = None
        
        self.title("File Selector")
        
        tk.Button(self, text="Open Files", command=self.open_files).pack()
        tk.Button(self, text="Open Directory", command=self.open_directory).pack()
        
    def open_files(self):
        files = filedialog.askopenfiles(
            title="Select Files", initialdir=self.src_files,
            filetypes=[("All Files", "*.*")]
        )
        if files:
            self.src_files = os.path.dirname(files[0].name)
        
    def open_directory(self):
        directory = filedialog.askdirectory(initialdir=self.dst_files, 
                                            title="Select Directory")
        if directory:
            self.dst_files = os.path.dirname(directory)
        

if __name__ == "__main__":
    app = FileSelectorApp()
    app.mainloop()

还可以创建一个类来实现该行为。一个对象,它获取所需的函数并在每次调用该函数时管理目录变量,而不是在每次要打开 .fdfd

评论

0赞 Radu Mitroi 10/4/2023
嘿,谢谢!但是,我仍然想知道如何事先知道这些目录?这两个目录不是静态的,并且始终会根据用户需要执行的操作而更改。所以我不明白在先打开目录路径之前怎么可能知道它。一旦我打开它,我确实可以将路径存储到变量中,但是打开这些文件的功能将始终在存储它的变量之上 - 这意味着我不能添加“initialdir”参数,因为它总是需要引用它后面的东西,对吧?
0赞 nokla 10/5/2023
@RaduMitroi 请看编辑。