【问题标题】:How do I get a file path using a button?如何使用按钮获取文件路径?
【发布时间】:2025-12-29 10:00:11
【问题描述】:

我正在尝试创建一个按钮来使用tkinter 获取文件目录。我得到了弹出按钮,并且我创建的功能有效。问题是当函数返回值时,我得到的是“.!button”或“.!button1”而不是文件目录。

from tkinter import *
from tkinter import ttk
from tkinter import filedialog
gui = Tk()
gui.geometry("100x100")

def getFolderPath():
  return filedialog.askdirectory()

btnFind = ttk.Button(gui, text="Open Folder",command=getFolderPath)
btnFind.grid(row=0,column=2)
print(btnFind) 
gui.mainloop()

【问题讨论】:

    标签: python tkinter button


    【解决方案1】:

    print(btnFind) 行不打印绑定到按钮按下的函数的返回值,它打印出按钮本身的名称。事实上,从函数返回一些东西是没有用的,因为你不能访问返回值。最好创建一个全局变量来存储选定的文件夹,或者,在这种情况下,直接从函数中打印它:

    from tkinter import *
    from tkinter import ttk
    from tkinter import filedialog
    gui = Tk()
    gui.geometry("100x100")
    
    def getFolderPath():
       print(filedialog.askdirectory())
    
    btnFind = ttk.Button(gui, text="Open Folder",command=getFolderPath)
    btnFind.grid(row=0,column=2)
    gui.mainloop()
    

    要将值存储在全局变量中,请使用 global 关键字:

    from tkinter import *
    from tkinter import ttk
    from tkinter import filedialog
    gui = Tk()
    gui.geometry("100x100")
    
    folder = None  # Declare global variable first
    
    def getFolderPath():
       global folder
       folder = filedialog.askdirectory()
    
    btnFind = ttk.Button(gui, text="Open Folder",command=getFolderPath)
    btnFind.grid(row=0,column=2)
    gui.mainloop()
    

    这是一个示例,说明如何使用全局变量来存储文件夹,然后再使用它:

    from tkinter import *
    from tkinter import ttk
    from tkinter import filedialog
    gui = Tk()
    gui.geometry("200x100")
    
    folder = None
    
    def getFolderPath():
        global folder
        folder = filedialog.askdirectory()
    
    def onFolderConfirmed():
        global folder
        if folder is None:
            strvarError.set("Please select a folder first")
        else:
            doSomethingWithFolder()
    
    def doSomethingWithFolder():
        ...  # Your code here
    
    btnFind = ttk.Button(gui, text="Open Folder", command=getFolderPath)
    btnFind.grid()
    btnConfirm = ttk.Button(gui, text="Confirm Folder Choice", command=onFolderConfirmed)
    btnConfirm.grid(row=1)
    strvarError = StringVar()
    lblError = Label(gui, textvar=strvarError)
    lblError.grid(row=2)
    gui.mainloop()
    

    在这里我添加了另一个按钮来确认文件夹的选择。如果用户在没有选择文件夹的情况下按下它,它会提示他们选择一个;如果不是,它会执行一些其他代码。如果您希望在选择文件夹后立即运行其他代码,只需将该代码直接放入 getFolderPath 函数中即可。

    【讨论】:

    • 谢谢,但是有没有办法在这个函数中使用这个值,因为返回似乎不起作用。如果我想对目录做点什么,打印它也无济于事
    • 这取决于你想用这个值做什么。如果你想在那里创建一个新文件,那么你可以在函数中简单地做到这一点。或者,您可以将值存储在全局变量中以备后用。
    • 感谢 lecdi 提供了这么多帮助,当我尝试在 gui.mainloop() 之前最后打印文件夹时尝试此操作,当我打印时,我只得到 None 而不是文件目录。这很可能是我的错,因为我是 python 新手,你能帮忙多一点吗? prnt.sc/26hj1sm
    • 问题是print函数在程序开始的时候就在按钮被按下之前被调用了,所以变量folder还没有被设置,仍然是None .如果要使用全局变量,则必须等到选择了文件夹后才能使用它。也许,可能有另一个按钮来确认文件夹的选择,当单击它时,您将使用全局变量。在这种情况下,您需要检查它是否为None,并告诉用户选择一个文件夹是否为None。 (想法是None,直到用户选择一个文件夹)
    • 我不明白程序开头的打印是什么意思,最后打印的不是吗? prnt.sc/26hj1sm。还有一件事我可以实际打印这个值的唯一方法是,如果我把它放在 .mainloop 之后,这不方便,因为我必须结束程序才能让它工作?你说什么
    【解决方案2】:

    您正在打印按钮变量... 只需这样做:

    from tkinter import *
    from tkinter import filedialog, ttk
    
    
    gui = Tk()
    gui.geometry("100x100")
    
    
    def getFolderPath():
      file = filedialog.askdirectory()
      #do what you want with file
    
    ttk.Button(gui, text="Open Folder",command=getFolderPath).grid(row=0,column=2)
    
     
    gui.mainloop()
    

    【讨论】:

    • 在此之后变量将是一个局部变量,所以我不能在函数之外使用它,有没有办法全局使用该变量?
    • 可以在分配变量文件之前放:全局文件
    • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。