将目录名传递给askopenfilename

-1 投票
1 回答
8814 浏览
提问于 2025-04-18 17:11

我有三个函数。第一个函数叫 dirBut,用户可以通过它选择一个文件夹,选择的文件夹路径会存储在 dirname 变量里,并且会更新一个输入框。第三个函数叫 dataInput,用户可以通过它选择一个文件。我希望在用户选择文件时,打开的文件选择对话框能够默认在之前用户选择的文件夹,也就是 dirname 指定的地方。不过,我不太确定怎么把 dirname 传递给一个处理函数,以便在 askopenfilename 中使用,因为 askdirectory 是通过一个按钮来调用的。

def UserFileInput(self,status,name):
    row = self.row
    optionLabel = tk.Label(self)
    optionLabel.grid(row=row, column=0, sticky='w')
    optionLabel["text"] = name
    text = status
    var = tk.StringVar(root)
    var.set(text)
    w = tk.Entry(self, textvariable= var)
    w.grid(row=row, column=1, sticky='ew')
    self.row += 1

    return w, var


def askdirectory(self):
    dirname = tkFileDialog.askdirectory()
    if dirname:
      self.directoryEntry.delete(0, tk.END)
      self.directoryEntry.insert(0, dirname)


def askfilename(self):
  filename = tkFileDialog.askopenfilename(initialdir=dirname)
  if filename:
    self.dataInput.delete(0, tk.END)
    self.dataInput.insert(0, filename)

currentDirectory = os.getcwd()
directory,var = self.UserFileInput(currentDirectory, "Directory")
self.directoryEntry = directory

dirBut = tk.Button(self, text='Select directory...', command = self.askdirectory)
dirBut.grid(row=self.row-1, column=2)

dataInput, var = self.UserFileInput("", "Data input")
self.dataInput = dataInput

fileBut = tk.Button(self, text='Select input file...', command = self.askfilename)
fileBut.grid(row=self.row-1, column=2)

1 个回答

5

假设 askdirectoryaskfilename 是同一个类里的东西,试着把目录赋值给 self.dirname,而不是 dirname。这样的话,这个变量在这个类的任何地方都能被看到。

def askdirectory(self):
    self.dirname = tkFileDialog.askdirectory()
    if self.dirname:
      self.directoryEntry.delete(0, tk.END)
      self.directoryEntry.insert(0, self.dirname)


def askfilename(self):
  filename = tkFileDialog.askopenfilename(initialdir=self.dirname)
  if filename:
    self.dataInput.delete(0, tk.END)
    self.dataInput.insert(0, filename)

撰写回答