Python диалоговое окно выбора файла

Обновлено: 04.07.2024

Я хотел бы получить путь к файлу в качестве входных данных в моем консольном приложении Python.

В настоящее время я могу запрашивать только полный путь в качестве ввода в консоли.

Есть ли способ запустить простой пользовательский интерфейс, в котором пользователи могут выбирать файл вместо того, чтобы вводить полный путь?

Как насчет использования tkinter?

Я получил TypeError: объект 'module' не может быть вызван в Tk (). Remove () - есть идеи? Мне пришлось сделать root = Tk.Tk (), затем root.withdraw (). Однако теперь диалоговое окно открытия файла не закрывается. Используя Python 3.x, и я считаю, что «Tkinter» на самом деле должен быть полностью в нижнем регистре, «tkinter». @WestAce: да, он был изменен с "Tkinter" на "tkinter" для Python3 Есть ли способ разрешить только определенные типы файлов? например, для Я хочу, чтобы пользователь

Версия Python 3.x ответа Etaoin для полноты:

Для полного параллелизма, вероятно, также должен быть import tkinter + tkinter.Tk().withdraw() . у меня это не работает (на Mac, Python 3.6.6) Окно графического интерфейса открывается, но вы не можете его закрыть, и вы получаете мяч смерти тоже самое. диалоговое окно с файлом не закрывается этот код полностью совпадает с принятым ответом, но является неполным. На Mac 10.14.6 это открыло средство поиска файлов, а затем просто

С EasyGui (документация, созданная pydoc и epydoc для версии 0.96):

На данный момент это лучшее решение. Основная причина в том, что easygui представляет собой пакетный пакет и его легко установить В Mac OSX 10.14.5, python 3.6.7, easygui 0.98.1 я получаю ужасный сбой, когда пытаюсь это сделать. Не рекомендуется. @ChristopherBarber то же самое с 10.14.6. Python просто продолжает уходить.

В Python 2 используйте tkFileDialog модуль.

В Python 3 используйте tkinter.filedialog модуль.

Это не является частью стандартной установки в Python 3.

У меня была ситуация, когда я разрабатывал серверное приложение Python (без компонента GUI) и, следовательно, не хотел вводить зависимость от каких-либо инструментов графического интерфейса Python, но я хотел, чтобы некоторые из моих сценариев отладки параметризовались входными файлами, и я хотел визуально запрашивать у пользователя файл, если он не указал его в командной строке. Зенити идеально подошел. Для этого вызовите zenity --file-selection с помощью модуля subprocess и запишите stdout. Конечно, это решение не зависит от Python.

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

Я получил гораздо лучшие результаты с wxPython, чем с tkinter, как это предлагается в этом ответе на более поздний повторяющийся вопрос:

Версия wxPython создавала диалоговое окно файла, которое выглядело так же, как диалоговое окно открытия файла практически из любого другого приложения в моей установке OpenSUSE Tumbleweed с рабочим столом xfce, тогда как tkinter создавал что-то тесное и трудное для чтения с незнакомым интерфейсом с боковой прокруткой.

Распространенный сценарий применения диалоговых окон — уведомление пользователей о событиях, которые происходят в приложении: сделана новая запись или произошла ошибка при попытке открыть файл. Рассмотрим базовые функции Tkinter, предназначенные для отображения диалоговых окон.

Окна предупреждений

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

Окна предупреждений

Эти диалоговые окна открываются с помощью функций showinfo , showwarning и showerror из модуля tkinter.messagebox :

Как работают окна с уведомлениями

В первую очередь нужно импортировать модуль tkinter.messagebox , задав для него алиас mb . В Python2 этот модуль назывался tkMessageBox , поэтому такой синтаксис позволит изолировать проблемы совместимости.

Каждое окно обычно выбирается в зависимости от информации, которую нужно показать пользователю:

  • showinfo — операция была завершена успешно,
  • showwarning — операция была завершена, но что-то пошло не так, как планировалось,
  • showerror — операция не была завершена из-за ошибки.

Окна выбора ответа

Другие типы диалоговых окон в Tkinter используются для запроса подтверждения от пользователя. Это нужно, например, при сохранении файла или перезаписывании существующего.

Эти окна отличаются от ранее рассмотренных тем, что значения, возвращаемые функцией, зависят от кнопки, по которой кликнул пользователь. Это позволяет взаимодействовать с программой: продолжать или же отменять действие.

В этой программе рассмотрим остальные диалоговые функции из модуля tkinter.messagebox . Каждая кнопка включает метки с описанием типа окна, которое откроется при нажатии:

Окна выбора ответа

У них есть кое-какие отличия, поэтому стоит попробовать каждое из окон, чтобы разобраться в них.

Как и в прошлом примере сначала нужно импортировать tkinter.messagebox с помощью синтаксиса import … as и вызывать каждую из функций вместе с title и message :

Как работают вопросительные окна

Чтобы избежать повторений при создании экземпляра кнопки и функции обратного вызова определим метод create_button , который будет переиспользоваться для каждой кнопки с диалогами. Команды всего лишь выводят результат функции dialog , переданной в качестве параметра, что позволит видеть значение, которое она возвращает в зависимости от нажатой пользователем кнопки.

Выбор файлов и папок

Диалоговые окна для выбора файлов позволяют выбирать один или несколько файлов из файловой системы. В Tkinter эти функции объявлены в модуле tkinter.filedialog , который также включает окна для выбора папок. Он также позволяет настраивать поведение нового окна: например, фильтрация по расширению или выбор папки по умолчанию.

В этом приложении будет две кнопки. Первая, «Выбрать файл», откроет диалоговое окно для выбора файла. По умолчанию в окне будут только файлы с расширением .txt :

Выбор файлов и папок

Вторая — «Выбор папки». Она будет открывать похожее диалоговое окно для выбора папки.

Обе кнопки будут выводить полный путь к выбранным файлу или папке и не делать ничего, если пользователь выберет вариант Отмена .

Первая кнопка будет вызывать функцию askopenfilename , а вторая — askdirectory :

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

Как работают окна выбора файлов и папок

Создадим первое диалоговое окно с помощью функции askopenfilename , которая возвращает строку с полным путем к файлу. Она принимает следующие опциональные аргументы:

  • title — название для диалогового окна.
  • initialdir — начальная папка.
  • filetypes — последовательность из двух строк. Первая — метка с типом файла в читаемом формате, а вторая — шаблон для поиска совпадения с названием файла.
  • multiple — булево значение для определения того, может ли пользователь выбирать несколько файлов.
  • defaultextension — расширение, добавляемое к файлу, если оно не было указано явно.

В этом примере задаем корневую папку в качестве начальной, а также название. В кортеже типов файлов есть следующие три варианта: текстовые файлы, сохраненные с расширением .txt, изображения с .jpg, .jpg и .jpg, а также подстановочный знак («*») для всех файлов.

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

Создадим свое диалоговое окно. Для примера оно создается используя несколько виджетов:

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

Для информирования пользователя о процессах происходящих в ПК можно использовать messagebox - окно с информацией. При этом требуется дополнительно импортировать «подмодуль» tkinter - tkinter.messagbox , в котором описаны классы для окон данного типа.

Код созданного информационного окна может быть следующим:

Для привлечения внимания можно использовать окно предупреждения:

messagebox_warning

Окно с возникшей ошибкой ПО думаю встречал каждый, на питоне его можно создать, написав следующий код:

messagebox_error

Следующие примеры диалоговых окон, служат для ведения диалога программы с пользователем и сохранением его ответа в переменной.

Попробуйте создать следующие примеры диалоговых окон, подумайте об их различий и где они могут применяться? Напишите комментарий в коде к каждому диалоговому окну:

  1. Исследование: после каждого вызова диалогового окна добавьте команду print(response) , которая выведет в консоль значение выбранного варианта ответа.

Рассмотрим, как запрограммировать с помощью tkinter вызов диалоговых окон открытия и сохранения файлов и работу с ними. При этом требуется дополнительно импортировать «подмодуль» tkinter - tkinter.filedialog , в котором описаны классы для окон данного типа:

Здесь создаются два объекта ( document_open и document_save ): один вызывает диалоговое окно «Открыть», а другой «Сохранить как…». При выполнении скрипта, они друг за другом выводятся на экран после появления главного окна. Если не создать root, то оно все-равно появится на экране, однако при попытке его закрытия в конце возникнет ошибка.

Диалоговые окна – важнейшая составляющая взаимодействия приложения с пользователем. С ними вы сталкиваетесь в самых разных ситуациях: когда разрешаете программе определять ваше местоположение, когда подтверждаете свой возраст и в ряде других ситуаций.

Диалоговые окна в Python реализуются с помощью нескольких методов, каждый из которых отвечает за определенный блок. Сами диалоговые окна тоже бывают разными: уведомления, вопросительные, выбора файлов и так далее. Рассмотрим сегодня все тонкости работы с окнами в Python.

Окна уведомлений

Это самый простой тип диалоговых окон, цель которого – сообщить пользователю определенную информацию. Например, о том, что сделана новая запись или же об ошибке при попытке открыть документ.

Окна уведомлений разделяются на три типа: информационные, с предупреждением и с ошибкой. Продемонстрируем механизм их работы на примере такой программы.

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

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

Обратите внимание! При запуске каждое окно будет воспроизводить соответствующий его типу звук. А в зависимости от языка системы будет отличаться текст метки.

Чтобы вызвать стандартное информационное окно, используется метод showinfo . Для вызова предупреждения применим метод showwarning , а для получения ошибки используем showerror .

Когда будете просматривать этот код, обратите внимание: перед использованием всех этих методов необходимо импортировать модуль tkinter.messagebox , а потом вызывать метод непосредственно из того объекта, в котором расположена кнопка. Для этого используется команда self.show_.

import tkinter as tk

import tkinter.messagebox as mb

class App(tk.Tk):

def __init__(self):

super().__init__()

command=self.show_info)

command=self.show_warning)

command=self.show_error)

opts =

btn_info.pack(**opts)

btn_warn.pack(**opts)

btn_error.pack(**opts)

def show_info(self):

def show_warning(self):

def show_error(self):

app = App()

app.mainloop()

Принцип работы окон с уведомлениями

Итак, мы сперва импортируем модуль tkinter.messagebox , а для его задаем алиас mb . Если используется Python 2, то название этого модуля – tkMessageBox . Если же использовать алиас mb , то тогда решатся проблемы, связанные с совместимостью версий.

Тип окна выбирается в зависимости от того, что пользователю хочет предложить программа:

Окна выбора ответа

Если же требуется подтверждение какого-то действия со стороны пользователя, то используется другой тип диалоговых окон. Например, если требуется разрешение на перезапись какого-то файла или если требуется его сохранить. Вообще, применений может быть много, но типы кнопок ограничены всего пятью.

Tkinter. Диалоговые (всплывающие) окна

Для демонстрации приведем следующую программу.

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

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

Далее каждая функция вызывается для каждой из кнопок. В целом, программа выглядит следующим образом.

import tkinter as tk

import tkinter.messagebox as mb

class App(tk.Tk):

def __init__(self):

super().__init__()

def create_button(self, dialog, title, message):

command = lambda: print(dialog(title, message))

btn = tk.Button(self, text=title, command=command)

btn.pack(padx=40, pady=5, expand=True, fill=tk.BOTH)

app = App()

app.mainloop()

А теперь перейдем к разбору принципов работы вопросительных окон.

Принцип работы вопросительных окон

Чтобы не было повторений во время генерации кнопки и функции обратного вызова, необходимо сперва определить метод create_button . Он необходим, чтобы каждая кнопка с диалогами могла работать. Вследствие введенных команд, будет выдаваться результат функции dialog , что дает возможность понимать, какое значение ею возвращается в зависимости от кнопки, нажатой человеком.

Выбор файлов и папок

С помощью диалоговых окон для выбора файлов можно открывать файлы в Python. Возможен выбор одного или нескольких, которые есть в файловой системе. Чтобы воспользоваться этой функцией, в Tkinter существует отдельный модуль – tkinter.filedialog , в котором мы и найдем диалоговые окна для открытия папок и файлов.

С помощью этого модуля можно задавать целый ряд параметров: поведение окна, фильтрация, выбор папок по умолчанию.

Tkinter. Диалоговые (всплывающие) окна

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

Tkinter. Диалоговые (всплывающие) окна

Видим, что в ней есть две кнопки: выбора файла и выбора папки. По нажатию на каждую будет открыто соответствующее окно.

После срабатывания функций, которые вызываются при активации события «При нажатии», будет возвращено полное имя файла. Если же пользователь нажал кнопку «Отмена», то не выводится ничего.

Для вызова окна выбора файла в нашем примере используется функция askopenfilename , а для папок – askdirectory .

Приведем код, который реализует этот функционал.

import tkinter as tk

import tkinter.filedialog as fd

class App(tk.Tk):

def __init__(self):

super().__init__()

btn_file.pack(padx=60, pady=10)

btn_dir.pack(padx=60, pady=10)

def choose_file(self):

filetypes=filetypes)

if filename:

print(filename)

def choose_directory(self):

if directory:

print(directory)

app = App()

app.mainloop()

Так, как возможна отмена выбора пользователя, то можно еще добавить обработчик возврата пустой строки. Эта валидация используется в любом приложении, которое будет работать с полными именами файлов.

Принцип работы окон выбора файлов и папок

Функция askopenfilename используется для создания диалогового окна и, как мы поняли раньше, возвращает пустую строку. Также в ней возможно использование некоторых дополнительных аргументов:

  • title . Название окна.
  • initialdir . Папка, которая открывается первоначально.
  • filetypes . Это две строки, которые возвращают тип файла и шаблон поиска файла соответственно.
  • multiple – разрешение или отсутствие разрешения выбора нескольких файлов.
  • defaultextension – стандартное расширение, добавляемое к файлу.

Сохранение данных в файл

Кроме открытия файла, необходимо уметь сохранять данные в файл. Для этого используется соответствующее диалоговое окно, которое вызывается функцией asksavefile . Чтобы ею воспользоваться, необходимо подключить модуль tkinter.filedialog .

Действия, выполняемые этой функцией, следующие. Это или создание файла в режиме записи, или же возврат значения None в случае закрытия окна.

import tkinter as tk

import tkinter.filedialog as fd

class App(tk.Tk):

def __init__(self):

super().__init__()

self.text = tk.Text(self, height=10, width=50)

self.text.pack()

self.btn_save.pack(pady=10, ipadx=5)

def save_file(self):

contents = self.text.get(1.0, tk.END)

Читайте также: