Возвращает путь к файлу файла из tkinter filedialog - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь создать простой графический интерфейс с tkinter, который позволяет пользователям выбирать файл, используя окно браузера файлов, которое будет входом для другого скрипта на python.Я хотел бы иметь виджет Entry, который позволяет пользователю вводить путь к файлу вручную.Если пользователь решит выбрать файл из браузера, а не набирать его, я бы хотел, чтобы на виджете «Ввод» отображался выбранный путь к файлу.

Приведенный ниже код может создать форму (я не отформатировалвиджетов очень много) и выводится диалоговое окно файла.С помощью функции 'show_file_browser' я могу вернуть полный путь к файлу.У меня возникла проблема с вставкой этого пути к файлу в виджет «Запись».

В настоящее время я получаю сообщение об ошибке:

NameError: name 'filepath' is not defined

Эта ошибка возникает из функции first_browser.Поскольку 'filepath' объявлен в функции 'init_window', он не определен, когда я пытаюсь установить его в 'first_browser'.Если не считать 'filepath' глобальной переменной (которая, я не уверен, исправит проблему), есть ли простой способ выполнить задачу, которую я пытаюсь выполнить?

import tkinter as tk
from tkinter import filedialog

class Window(tk.Frame):
    def __init__(self, master = None):
        tk.Frame.__init__(self, master)
        self.master = master
        self.init_window()

    def init_window(self):
        self.master.title("Form Title")
        self.pack(fill = 'both', expand = 1)

        filepath = tk.StringVar()

        quitButton = tk.Button(self, text = 'Quit',
                               command = self.close_window)
        quitButton.place(x = 0, y = 0)

        browseButton = tk.Button(self, text = 'Browse',
                                 command = self.first_browser)
        browseButton.place(x = 0, y = 30)

        filepathText = tk.Entry(self, textvariable = filepath)
        filepathText.pack()

    def close_window(self):
        form.destroy()

    def show_file_browser(self):
        self.filename = filedialog.askopenfilename()
        return self.filename

    def first_browser(self):
        filepath.set = self.show_file_browser()

form = tk.Tk()
form.geometry("250x250")
form.resizable(0, 0)

app = Window(form)

form.mainloop()

1 Ответ

1 голос
/ 12 апреля 2019

Попробуйте с этим

class Window(tk.Frame):
    def __init__(self, master = None):
        tk.Frame.__init__(self, master)
        self.master = master
        self.init_window()


    def init_window(self):
        self.master.title("Form Title")
        self.pack(fill = 'both', expand = 1)

        self.filepath = tk.StringVar()

        quitButton = tk.Button(self, text = 'Quit',
                               command = self.close_window)
        quitButton.place(x = 0, y = 0)

        browseButton = tk.Button(self, text = 'Browse',
                                 command = self.first_browser)
        browseButton.place(x = 0, y = 30)

        filepathText = tk.Entry(self, textvariable = self.filepath)
        filepathText.pack()

    def close_window(self):
        form.destroy()

    def show_file_browser(self):
        self.filename = filedialog.askopenfilename()
        return self.filename

    def first_browser(self):
        file = self.show_file_browser()
        self.filepath.set(file)

для создания "global" variable внутри класса вы должны добавить self. перед именем переменной. В вашем коде вы написали внутри функции first_browser(self) filepath.set = self.show_file_browser() но вы не можете сделать это, прежде чем вам нужно будет принять значение, возвращаемое self.show_file_browser(), делая это value=self.show_file_browser(), и после того, как вы можете установить переменную ввода в это значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...