使用 tkinter 文本小部件从'Browse'按钮显示用户选择的目录路径



我一直在尝试链接用户选择的文件夹路径,以便将其放置在右侧的文本字段中。我试过几种不同的方法都没有用。以下是我迄今为止的收获。非常感谢您的帮助。这就是我现在的位置。

from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
import tkinter as tk
class ParentWindow(Frame):
def __init__(self, master, *args, **kwargs):
Frame.__init__(self, master, *args, **kwargs)
self.master = master
self.master.minsize(550,175)
self.master.maxsize(550,175)
self.master.title("Check Files")
self.master.configure(bg="#F0F0F0")
#DEFINE BUTTONS
self.btn_browse1 = tk.Button(self.master,width=12,height=1,text="Browse...",command = lambda: 
browse())
self.btn_browse1.grid(row=2,column=0,padx=(15,0),pady=(40,0),sticky=W)
self.btn_browse2 = tk.Button(self.master,width=12,height=1,text="Browse...",command = lambda: 
browse())
self.btn_browse2.grid(row=3,column=0,padx=(15,0),pady=(10,0),sticky=W)
self.btn_checkForFiles = tk.Button(self.master,width=12,height=2,
text="Check for files...",command = lambda: check())
self.btn_checkForFiles.grid(row=4,column=0,padx=(15,0),pady=(10,0),sticky=W)
self.btn_close = tk.Button(self.master,width=12,height=2,text="Close Program")
self.btn_close.grid(row=4,column=1,padx=(15,0),pady=(10,0),sticky=S+E)

#DEFINE TEXT BOXES
self.txt_browse1 = tk.Entry(self.master,width=65,text="")
self.txt_browse1.grid(row=2,column=1,padx=(25,0),pady=(35,0),sticky=W)
self.txt_browse2 = tk.Entry(self.master,width=65,text="")
self.txt_browse2.grid(row=3,column=1,padx=(25,0),pady=(5,0),sticky=W)

def browse(): 
dirname = filedialog.askdirectory()

if __name__ == "__main__":
root = tk.Tk()
App = ParentWindow(root)
root.mainloop()

您应该将browse()函数作为类ParentWindow下的一个方法,这样它就可以访问窗口的所有小部件。然后,您只需要将目录的名称插入到入口小部件中。更好的是,每个都有一个浏览功能:

class ParentWindow(Frame):
###
### Your code
### 
def browse1(self): 
dirname = filedialog.askdirectory()
self.txt_browse1.delete("1",END)
self.txt_browse1.insert("1",dirname)

def browse2(self): 
dirname = filedialog.askdirectory()
self.txt_browse2.delete("1",END)
self.txt_browse2.insert("1",dirname)

请注意,如果您这样做,您将不得不将函数作为方法调用。因此,将按钮定义中的命令参数更改为self.browse1/2:

self.btn_browse1 = tk.Button(self.master,width=12,height=1,text="Browse...",command = lambda: self.browse1())
self.btn_browse2 = tk.Button(self.master,width=12,height=1,text="Browse...",command = lambda: self.browse2())

一个相对简单的方法是将browse()调用传递给与每个Entry小部件关联的textvariable,它所要做的就是将filedialog.askdirectory()返回的值分配给它。

以下是您的代码的修改版本,它正是这样做的:

from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
import tkinter as tk
class ParentWindow(Frame):
def __init__(self, master, *args, **kwargs):
Frame.__init__(self, master, *args, **kwargs)
self.master = master
self.master.minsize(550,175)
self.master.maxsize(550,175)
self.master.title("Check Files")
self.master.configure(bg="#F0F0F0")
#DEFINE BUTTONS
self.btn_browse1 = tk.Button(self.master, width=12, height=1, text="Browse...",
command=lambda: browse(path1))
self.btn_browse1.grid(row=2, column=0, padx=(15,0), pady=(40,0), sticky=W)
self.btn_browse2 = tk.Button(self.master, width=12, height=1, text="Browse...",
command=lambda: browse(path2))
self.btn_browse2.grid(row=3, column=0, padx=(15,0), pady=(10,0), sticky=W)
self.btn_checkForFiles = tk.Button(self.master, width=12, height=2,
text="Check for files...",
command=lambda: check())
self.btn_checkForFiles.grid(row=4, column=0, padx=(15,0), pady=(10,0), sticky=W)
self.btn_close = tk.Button(self.master, width=12, height=2, text="Close Program")
self.btn_close.grid(row=4, column=1, padx=(15,0), pady=(10,0), sticky=S+E)
#DEFINE TEXT BOXES
path1 = tk.StringVar(value='')
path2 = tk.StringVar(value='')
self.txt_browse1 = tk.Entry(self.master, width=65, textvariable=path1)
self.txt_browse1.grid(row=2, column=1, padx=(25,0), pady=(35,0), sticky=W)
self.txt_browse2 = tk.Entry(self.master, width=65, textvariable=path2)
self.txt_browse2.grid(row=3, column=1, padx=(25,0), pady=(5,0), sticky=W)

def browse(pathvar):
dirname = filedialog.askdirectory()
pathvar.set(dirname)

if __name__ == "__main__":
root = tk.Tk()
App = ParentWindow(root)
root.mainloop()

最新更新