Python Tkinter Filedialog.askopenfilename迭代

Python Tkinter Filedialog.askopenfilename迭代,python,tkinter,iteration,openfiledialog,Python,Tkinter,Iteration,Openfiledialog,我正在开发程序来加载文件,并用这些加载的文件执行一些计算 为此,我编写了一个简单的迭代代码来加载tkinter变量。窗口、标签、条目和按钮位置已完成。到目前为止,我掌握的代码是: import tkinter as tk from tkinter import ttk, filedialog LARGE_FONT = ("Arial", 12) MEDIUM_FONT = ("Arial", 11) REGULAR_FONT = ("Arial", 10) text_z = ["Select

我正在开发程序来加载文件,并用这些加载的文件执行一些计算

为此,我编写了一个简单的迭代代码来加载tkinter变量。窗口、标签、条目和按钮位置已完成。到目前为止,我掌握的代码是:

import tkinter as tk
from tkinter import ttk, filedialog

LARGE_FONT = ("Arial", 12)
MEDIUM_FONT = ("Arial", 11)
REGULAR_FONT = ("Arial", 10)

text_z = ["Select file 1", "Select the file 2", "Select file 3", "Select file 4"]

window=tk.Tk()

def click(): 
    z = tk.filedialog.askopenfilename(initialdir = "/",title = "Select file", filetypes = ( ("Excel file", "*.xlsx"), ("All files", "*.*") ) )
    a[i-2].insert(tk.END, z)
    z[i] = a[i-2].get()

##Main program
#There is an image I will add at the end on row=0
ttk.Label(window, text="file load", font = LARGE_FONT, background = "white").grid(row=1, column=1, columnspan=3, padx=20, pady = 10, sticky="W")

a = [tk.StringVar(window) for i in range(len(text_z))]

for i in range(2,len(text_z)+2): 
    Label_z = ttk.Label(window, text=text_z[i-2], background="white").grid(row= 2*i, column=0,columnspan=3, padx=10, pady=2, sticky="W")
    a[i-2] = ttk.Entry(window, width=60, background="gray")
    a[i-2].grid(row= 2*i+1, column=0, columnspan=3, padx=10, sticky="WE")
    ttk.Button(window, text="Search", width=10, command=click).grid(row= 2*i+1, column=3, padx=5, sticky="W")

window.mainloop()
我的问题是点击按钮。它应该在单击的过程中运行askopenfilename,获取文件路径并显示在entrybox上,但所有按钮都会将其指向上次创建的entrybox

有人能帮我解决这个问题吗


非常感谢

Lambda
前往救援。您需要知道要更新的右按钮条目对。因此,按下按钮时,传递相应索引的值

import tkinter as tk
from tkinter import ttk, filedialog

LARGE_FONT = ("Arial", 12)
MEDIUM_FONT = ("Arial", 11)
REGULAR_FONT = ("Arial", 10)

text_z = ["Select file 1", "Select the file 2", "Select file 3", "Select file 4"]

window=tk.Tk()

def click(m): 
    z = tk.filedialog.askopenfilename(initialdir = "~",title = "Select file", filetypes = ( ("Text files", "*.txt"), ("All files", "*.*") ) )
    a[m].insert(tk.END, z)

ttk.Label(window, text="file load", font = LARGE_FONT, background = "white").grid(row=1, column=1, columnspan=3, padx=20, pady = 10, sticky="W")

a = [None for i in range(len(text_z))]

for i in range(2,len(text_z)+2): 
    Label_z = ttk.Label(window, text=text_z[i-2], background="white").grid(row= 2*i, column=0,columnspan=3, padx=10, pady=2, sticky="W")
    a[i-2] = ttk.Entry(window, width=60, background="gray")
    a[i-2].grid(row= 2*i+1, column=0, columnspan=3, padx=10, sticky="WE")
    ttk.Button(window, text="Search", width=10, command=lambda m=i-2:click(m)).grid(row= 2*i+1, column=3, padx=5, sticky="W")

window.mainloop()

我认为您应该通过使用列表存储输入字段来简化一些事情。 为此,我认为最好为每组小部件添加框架,并使用范围索引来获得我们需要的内容

我对您的代码做了一些修改,使其更易于使用列表索引,并添加了一个按钮,该按钮将打印每个输入字段上的每个选定路径,以显示这些值是可访问的

import tkinter as tk
from tkinter import ttk, filedialog

LARGE_FONT = ("Arial", 12)
MEDIUM_FONT = ("Arial", 11)
REGULAR_FONT = ("Arial", 10)

text_z = ["Select file 1", "Select the file 2", "Select file 3", "Select file 4"]

window = tk.Tk()

def click(x): 
    z = tk.filedialog.askopenfilename(initialdir="/", title="Select file", filetypes=(("Excel file", "*.xlsx"), ("All files", "*.*")))
    a[x].insert(tk.END, z)

ttk.Label(window, text="file load", font=LARGE_FONT, background="white").grid(row=1, column=0, padx=20, pady=10, sticky="w")

a=[]

for i in range(len(text_z)): 
    frame = tk.Frame(window)
    frame.grid(row=i+2, column=0, sticky="nsew")
    ttk.Label(frame, text=text_z[i], background="white").grid(row=0, column=0, columnspan=3, padx=10, pady=2, sticky="w")
    a.append(ttk.Entry(frame, width=60, background="gray"))
    a[i].grid(row=1, column=0, columnspan=3, padx=10, sticky="ew")
    ttk.Button(frame, text="Search", width=10, command=lambda x=i: click(x)).grid(row=1, column=3, padx=5, sticky="w")

def pring_current_paths():
    for ndex, entry in enumerate(a):
        print("Entry {}: ".format(ndex, entry.get()))

tk.Button(window, text="Print gurrent paths!", command=pring_current_paths).grid()

window.mainloop()

抱歉@Miraj50,用这些项目编辑了问题