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

Диалоговые окна

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

Модули пакета необходимо импортировать отдельно. То есть вы импортируете содержимое tkinter (например, from tkinter import * ) и отдельно входящий в состав пакета tkinter модуль. Способы импорта на примере messagebox и пример вызова одной из функций модуля:

import tkinter.messagebox → tkinter.messagebox.askyesno()

from tkinter.messagebox import * → askyesno()

from tkinter import messagebox → messagebox.askyesno()

from tkinter import messagebox as mb (вместо mb может быть любой идентификатор) → mb.askyesno()

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

Модуль messagebox – стандартные диалоговые окна

Окно выбора «да» или «нет» – askyesno :

Нажатие «Да» в диалоговом окне возвращает в программу True , «Нет» вернет False (также как закрытие окна через крестик). Таким образом в коде можно обработать выбор пользователя. В данном случае если последний соглашается, то данные переносятся из поля в метку.

Опции title и message являются позиционными, так что можно указывать только значения: askyesno(«Вопрос», «Перенести данные?») .

Подобные окна генерируются при использовании функции askokcancel с надписями на кнопках «ОК» и «Отмена», askquestion (возвращает не True или False , а строки ‘yes’ или ‘no’), askretrycancel («Повторить», «Отмена»), askyesnocancel («Да», «Нет», «Отмена»).

Другую группу составляют окна с одной кнопкой, которые служат для вывода сообщений различного характера. Это showerror , showinfo и showwarning .

Модуль filedialog – диалоговые окна открытия и сохранения файлов

Рассмотрим две функции из модуля filedialog – askopenfilename и asksaveasfilename . Первая предоставляет диалоговое окно для открытия файла, вторая – для сохранения. Обе возвращают имя файла, который должен быть открыт или сохранен, но сами они его не открывают и не сохраняют. Делать это уже надо программными средствами самого Python.

Опция filetype позволяет перечислить типы файлов, которые будут сохраняться или открываться, и их расширения.

Примечание. В приведенном коде при размещении текстового поля методом grid не указаны аргументы row и column . В таких случаях подразумевается, что их значениями являются нули.

Практическая работа

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

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

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

Курс с примерами решений практических работ: android-приложение, pdf-версия.

Диалоговые (всплывающие) окна / tkinter 9

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

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

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

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

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

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

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

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

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

Все три функции получают две строки в качестве входящих аргументов: заголовок и сообщение.

Сообщение может быть выведено на нескольких строках с помощью символа новой строки \n .

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

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

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

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

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

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

Читайте также:  Жесты для трекпада os mac

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Разработка графического интерфейса Python с помощью Tkinter: Часть 3

Автор: Mateusz Dobrychlop
Дата записи

Это третья часть нашей многосерийной серии по разработке графических интерфейсов на Python с использованием Tkinter. Проверьте ссылки ниже для других частей этой серии:

  • Разработка графического интерфейса Python с помощью Tkinter
  • Разработка графического интерфейса Python с помощью Tkinter: Часть 2
  • Разработка графического интерфейса Python с помощью Tkinter: Часть 3

Вступление

Tkinter – это де-факто стандартный пакет для построения графических интерфейсов в Python. В Stackabuse first и second части учебника Tkinter мы узнали, как использовать основные строительные блоки GUI для создания простых интерфейсов.

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

Диалоговое окно файла

Предоставление пользователю возможности выбрать файл на своем компьютере, очевидно, является очень распространенной особенностью графических интерфейсов. Диалоговые окна файлов обычно довольно сложны – они объединяют по крайней мере несколько кнопок (например, Open , Cancel или Create New Folder ) и фрейм, который отображает структуру каталогов нашей среды. Основываясь на наших предыдущих уроках, вы можете предположить, что с помощью Tkinter очень трудно создать такую сложную функцию. Однако на самом деле это не так. Взгляните на следующий пример:

Приведенный выше код-это все, что вам нужно для отображения приятного, полезного диалога File Dialog . В строке 2 мы импортируем содержимое класса filedialog . Затем, после создания нашего окна root в строке 4, мы определяем новую функцию в строке 6 (которая должна выполняться кнопкой, созданной в строке 17 и упакованной в строку 18).

Давайте взглянем на определение функции print_path () . В строке 7 мы выполняем функцию askopenfilename , которая принимает несколько аргументов. Первым аргументом, конечно, является родительский виджет диалогового окна (который в данном случае является нашим корневым окном). Затем в аргументе initialdir мы указываем местоположение, которое будет отображаться в нашем диалоговом окне файла сразу после его открытия. title управляет содержимым строки заголовка диалогового окна.

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

Аргумент для типов файлов представляет собой список 2-элементных кортежей. В каждом кортеже первым элементом является строка, представляющая собой любое описание, которое мы хотим задать для каждого из типов файлов. Второй элемент – это то, где мы указываем или перечисляем расширения файлов, связанные с каждым типом файла (если есть только одно расширение, это строка, в противном случае это кортеж). Как вы можете видеть на скриншоте вывода выше, пользователь может выбрать отображаемый тип файла из выпадающего списка в правом нижнем углу диалогового окна.

Читайте также:  Зарезервированное хранилище windows 10 что это

Метод askopenfilename() возвращает строку, которая является путем к файлу, выбранному пользователем. Если пользователь решает нажать Cancel , возвращается пустая строка. В строке 7 мы возвращаем путь к переменной f , а затем в строке 15 (которая выполняется только после закрытия диалогового окна файла) путь печатается в консоли.

Отображение Изображений С Помощью Tkinter

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

Давайте посмотрим, что изменилось внутри функции, выполняемой нашей кнопкой, теперь переименованной в display_image . Мы выводим диалоговое окно файла, используем те же критерии выбора файла, что и раньше, и снова сохраняем возвращенный путь в переменной f . Однако после получения пути к файлу мы не печатаем его в консоли. Мы создаем окно верхнего уровня в строке 14. Затем в строке 16 мы создаем экземпляр объекта класса PhotoImage , заставляя его читать файл .png , выбранный пользователем. Затем объект сохраняется в переменной image , которую мы можем передать в качестве аргумента для построения виджета Label в строке 17. В строке 18 мы обязательно сохраняем ссылку на объект image , чтобы он не был очищен сборщиком мусора Python . Затем в строке 19 мы упаковываем нашу метку (на этот раз отображающую изображение, а не текст) внутри new_window .

Выбор Цвета

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

В строке 2 примера, показанного выше, мы импортируем класс с именем color chooser . Мы используем его метод askcolor() в строке 7. Этот метод, как и askopenfilename() , отвечает за открытие красивого, сложного диалога (в данном случае выбор цвета) и возвращает данные, зависящие от выбора пользователя. В этом случае после того, как пользователь выбирает цвет из палитры и принимает свой выбор, объект, возвращаемый переменной color , представляет собой кортеж, содержащий два элемента. Первый элемент-это кортеж, который хранит значения для красного, зеленого и синего каналов выбранного цвета. Второй элемент кортежа имеет тот же цвет, что и в формате hexadecimal . Мы можем видеть содержимое кортежей в нашей консоли, благодаря print() в строке 8.

После того как мы сохраним кортеж , возвращенный askcolor в переменной color , мы затем используем эту переменную в строке 9 для настройки кнопки b1 . Как вы уже знаете, аргумент bg отвечает за управление цветом фона кнопки. Передаем ему первый элемент кортежа color (представление цвета в шестнадцатеричном формате). В результате, после нажатия кнопки b1 пользователь может изменить свой цвет фона, используя хороший выбор цвета.

Окна сообщений

Прежде чем перейти от Tkinter к Python MegaWidgets, полезно упомянуть еще одну особенность модуля Tkinter, которая делает программирование GUI немного быстрее. Tkinter предлагает так называемые Окна сообщений, которые представляют собой набор простых, но широко используемых стандартных диалогов . Эти окна сообщений могут использоваться для отображения быстрого сообщения, предупреждения или когда нам нужно, чтобы наш пользователь принял простое решение “да/нет”. В следующем примере демонстрируются все окна сообщений, предлагаемые Tkinter:

На этот раз наша кнопка b1 выполняет функцию display_and_print() . Функция позволяет последовательно всплывать 7 окнам сообщений – каждое из них отображается после взаимодействия пользователя с предыдущим. диалоги, определенные в строках 11-21, – это диалоги, требующие от пользователя выбора одного из двух доступных вариантов, поэтому они возвращают значения на основе принятых решений и сохраняют их в соответствующих переменных. В каждом случае мы можем передать два аргумента при определении диалогов – первый всегда является заголовком диалога, а второй содержит содержание его основного сообщения.

Итак, начнем с самого верха. В строке 7 мы определяем простой диалог show info , который предназначен только для отображения нейтрального значка, сообщения и кнопки OK , которая закрывает его. В строках 8 и 9 мы имеем аналогичные, простые типы окон сообщений, но их значки указывают на то, что требуется предупреждение от пользователя ( showwarning ) или что произошла ошибка ( showerror ). Обратите внимание, что в каждом из трех случаев при появлении диалога воспроизводится другой звук.

Как я уже говорил, строки 11-21 содержат код, отвечающий за отображение диалогов для получения решения пользователя. askokcancel (строка 11) возвращает True если пользователь нажимает OK и False если он нажимает Cancel . askyesno (строка 14) возвращает True если пользователь нажимает Yes и False если пользователь нажимает No . askretrycancel (строка 17) возвращает True если пользователь нажимает Retry и False если пользователь нажимает Cancel . askquestion очень похож на askyesno , но возвращает ‘yes’ если пользователь нажимает Yes и ‘no’ если пользователь нажимает No .

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

Индикатор выполнения

Еще одним полезным элементом расширенных графических интерфейсов является индикатор выполнения . В следующем примере показана простая реализация этой функции с помощью Tkinter:

В приведенном выше примере показана реализация Progress bar . Он является частью модуля tkinter.ttk , который обеспечивает доступ к набору тематических виджетов Tk, представленному в Tk 8.5 . Вот почему нам нужно дополнительно импортировать модуль ttk в строке 3.

Читайте также:  Как переустановить установщик windows installer

Состояние нашего индикатора прогресса будет контролироваться временем – индикатор будет прогрессировать в десять шагов, выполняемых с интервалом в одну секунду. Для этого мы импортируем модуль time в строку 2.

Мы определяем наш Индикатор выполнения в строке 20. Мы определяем его родительский виджет ( root ), даем ему “горизонтальную” ориентацию и длину 200 пикселей. Затем мы определяем значение maximum , которое является значением переменной, назначенной индикатору выполнения с помощью аргумента var (в нашем случае переменной progress_var ), что означает, что индикатор выполнения заполнен полностью. Мы устанавливаем mode на “determinate”, что означает, что наш код будет перемещать длину индикатора в точно определенные точки на основе значения progress_var .

Целочисленная переменная progress_var , которая будет управлять прогрессом бара, определена в строке 18. В строке 26, используя задание типа словаря, мы устанавливаем начальное значение индикатора выполнения равным 0.

В строке 15 мы создаем кнопку , которая должна запустить часы, контролирующие ход нашего бара, выполнив функцию start () , определенную между строками 7 и 13. Там у нас есть простой цикл for , который будет перебирать значения от 1 до 10. С каждой итерацией значение progress_var обновляется и увеличивается на 1. Чтобы иметь возможность четко наблюдать за ходом выполнения, мы ждем одну секунду во время каждой итерации (строка 12). Затем мы используем метод корневого окна update_idletasks() в строке 13, чтобы позволить программе обновить внешний вид индикатора выполнения, даже если мы все еще выполняем цикл for (таким образом, технически мы все еще находимся в одной итерации mainloop () ).

Python Mega Widgets

Если вы широко используете Tkinter в своих проектах, я думаю, что это хорошая идея, чтобы рассмотреть возможность включения Python Mega Widgets в ваш код. Python MegaWidgets-это инструментарий, основанный на Tkinter, который предлагает набор megawidgets : сложных, функциональных и относительно эстетически приятных виджетов, сделанных из более простых виджетов Tkinter. Что замечательно в этом пакете, который вы можете скачать здесь , так это то, что общая философия определения и ориентации виджетов такая же, как и в случае с Tkinter, и вы можете смешивать обе библиотеки в своем коде. Давайте закончим наш урок, поцарапав поверхность этого мощного инструментария.

Виджет EntryField

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

На этот раз мы должны не только импортировать tkinter , но и наш недавно установленный Pmw пакет (строка 2). Как всегда, мы используем класс Tk для инициализации нашего корневого окна.

В строках 10-14 и 16-20 мы определяем два Pmw.EntryField виджеты. Поле ввода представляет собой функциональную смесь Tkinter Label и Entry с некоторым добавлением полезных функций. Первым аргументом для инициализации виджета является, конечно же, родительский виджет. label_text , entry_bg и entry_width управляют некоторыми самоочевидными аспектами внешнего вида виджета. Наиболее интересным аргументом в нашем примере, вероятно, является аргумент validate . Здесь мы можем решить, какие данные пользователь может поместить в поле.

В поле entry_color мы ожидаем строку букв, поэтому устанавливаем validate в “алфавитный”. В виджете entry_number мы ожидаем целое число, и именно на него мы устанавливаем значение аргумента validate . Таким образом, если мы попытаемся поместить число внутри первого и букву внутри второго, символы просто не появятся в виджетах, и будет воспроизводиться системный звук, сообщающий нам, что мы пытаемся сделать что-то не так. Кроме того, если виджет ожидает определенного типа данных и его содержимое находится в конфликте с этим условием в момент инициализации, поле EntryField будет выделено красным цветом.

Как вы можете видеть в нашем примере, сразу после того, как мы отобразим наше окно, первое поле ввода будет белым, а второе-красным. Это происходит потому, что пустая строка (содержимое записей по умолчанию) попадает в категорию “алфавитных” сущностей, но это определенно не целое число.

Кнопка, определенная в строке 26, выполняет команду color_entry_label () , определенную между строками 6 и 8. Цель функции-нарисовать фон метки виджета entry_number в соответствии с содержимым виджета entry_color . В строке 7 метод get() используется для извлечения содержимого поля entry_color | Entry . Затем, естественно, метод configure() используется для изменения внешнего вида виджета entry_number . Обратите внимание, что для изменения характеристик виджетов Pmw, состоящих из нескольких более простых виджетов, мы должны указать, какой суб-виджет мы хотим настроить (в нашем случае это метка — именно поэтому мы настраиваем label_bg , а не, скажем, entryfield_bg ).

Виджет EntryField может быть визуально не очень впечатляющим, но даже этот простой пример иллюстрирует потенциал мега-виджетов – создание такого рода самоподтверждающейся части интерфейса более высокой сложности потребовало бы гораздо больше кода, если бы мы попытались достичь того же эффекта с помощью простого Tkinter. Я призываю вас изучить другие мощные мега-виджеты, описанные в документации инструментария .

Вывод

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

Оцените статью