Tkinter Filedialog.askopenfilename итерация - PullRequest
0 голосов
/ 14 ноября 2018

Я разрабатываю программу для загрузки файлов и выполнения некоторых расчетов с этими загруженными файлами.

Для этого я написал простой итерационный код для загрузки переменных 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()

Моя проблема заключается в нажатии кнопки. Предполагалось, что во время клика запустите имя файла askopenfile, получите путь к файлу и укажите его в поле ввода, но все кнопки направляют его на последний созданный блок ввода.

Может кто-нибудь помочь мне с этим вопросом?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я думаю, вам следует немного упростить задачу, используя список для хранения полей ввода. Для этого я думаю, что было бы лучше добавить рамки для каждого набора виджетов и использовать индекс диапазона, чтобы получить то, что нам нужно.

Я немного изменил ваш код, чтобы упростить работу с индексом списка, а также добавил кнопку, которая будет распечатывать каждый выбранный путь в каждом поле ввода, чтобы показать, что эти значения доступны.

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()
0 голосов
/ 14 ноября 2018

Lambda на помощь. Нужно знать правильную пару Button-Entry для обновления. Поэтому передайте значение соответствующего индекса при нажатии кнопки.

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()

enter image description here

...