Вставить вывод диалогового окна файла в виджет ввода в Tkinter

#python #python-3.x #tkinter #widget #tkinter-entry

#python #python-3.x #tkinter #виджет #tkinter-запись

Вопрос:

Мне было интересно, смогу ли я получить чью-нибудь помощь. Я новичок в Tkinter и UI в целом и хочу создать его с помощью Tkinter. Единственная проблема, с которой я сейчас сталкиваюсь, — это добавление пути к файлу в виджет ввода, как показано ниже:

 from tkinter import *    
from tkinter import ttk    
from tkinter import filedialog
import tkcalendar
import datetime


class Feedback:

    def __init__(self, master):
        self.frame_date = ttk.Frame(master)
        self.frame_date.pack()

        self.style = ttk.Style()
        self.style.configure('Header.TLabel', font=('Arial', 12, 'bold'))

        ttk.Label(self.frame_date, text='Quarter Start Date', style='Header.TLabel').grid(row=0, column=0, padx=40)
        ttk.Label(self.frame_date, text='Quarter End Date', style='Header.TLabel').grid(row=0, column=1, padx=40)

        self.calendar_start = tkcalendar.DateEntry(self.frame_date)
        self.calendar_start.grid(row=1, column=0, padx=40, ipadx=20)
        self.calendar_end = tkcalendar.DateEntry(self.frame_date)
        self.calendar_end.grid(row=1, column=1, padx=40, ipadx=20)

        self.frame_docs = ttk.Frame(master)
        self.frame_docs.pack()

        ttk.Label(self.frame_docs, text='Choose Counter Level File', style='Header.TLabel').grid(row=0, column=0,
                                                                                                 columnspan=2)
        self.cl_import_button = ttk.Button(self.frame_docs, text='Import Counter Level',
                                           command=lambda: self.paste_file_name()).grid(row=1, column=0, ipadx=40)    #the button pressed to open up the file dialog

        self.my_string = StringVar()    #string variable used to hold file dialog input

        self.cl_filepath = ttk.Entry(self.frame_docs, textvariable=self.my_string).grid(row=2, column=0)    #the entry widget used to hold the file path

    def paste_file_name(self):    #the function called to open up the file dialog and save the path
        self.file_name = filedialog.askopenfile()
        self.my_string = self.file_name


def main():
    root = Tk()
    feedback = Feedback(root)
    root.mainloop()


if __name__ == '__main__': main()
 

Как вы можете видеть, я хотел бы добавить путь к файлу в строковую переменную ‘self.my_string’, которая является текстовой переменной моего виджета ввода. Это должно быть сделано только после нажатия кнопки импорта.

Комментарии:

1. что происходит, когда вы нажимаете кнопку импорта?

2. Используйте self.my_string.set(self.file_name.name) вместо этого. Однако лучше использовать askopenfilename() вместо askopenfile() .

3. вам не нужен лямбда-код для вашей команды button, поскольку вы не передаете параметры use command=self.paste_file_name вместо этого

4. Это идеально. Спасибо @acw1668, ваше предложение — это то, что мне было нужно.

5. @reece, спасибо за ваш быстрый ответ и ввод, это было высоко оценено.

Ответ №1:

Поскольку self.my_string это a StringVar , вы должны использовать self.my_string.set() для обновления его значения:

     def paste_file_name(self):    #the function called to open up the file dialog and save the path
        self.file_name = filedialog.askopenfile()
        self.my_string.set(self.file_name.name)
 

Обратите внимание, что askopenfile() это также откроет файл, поэтому, если вам нужно только имя файла, используйте askopenfilename() вместо:

     def paste_file_name(self):    #the function called to open up the file dialog and save the path
        self.file_name = filedialog.askopenfilename()
        self.my_string.set(self.file_name)
 

Комментарии:

1. Большое вам спасибо. Это именно то, что я искал. Я действительно ценю вашу помощь.