Как начать пользоваться Swing GUI-визардом IntelliJ IDEA. Подробная инструкция. Приложения с GUI

Главный писатель по вопросам технологий

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

До того, как вы сможете открыть файл GUI, вам необходимо выяснить, к какому виду файла относится расширения файла GUI.

Tip: Incorrect GUI file association errors can be a symptom of other underlying issues within your Windows operating system. These invalid entries can also produce associated symptoms such as slow Windows startups, computer freezes, and other PC performance issues. Therefore, it highly recommended that you scan your Windows registry for invalid file associations and other issues related to a fragmented registry.

Ответ:

Файлы GUI имеют Файлы данных, который преимущественно ассоциирован с Doom User Interface Information (Id Software Inc.).

Файлы GUI также ассоциированы с GUI Design Studio Project File (Caretta Software Ltd.) и FileViewPro.

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

Как открыть ваш файл GUI:

Самый быстрый и легкий способ открыть свой файл GUI - это два раза щелкнуть по нему мышью. В данном случае система Windows сама выберет необходимую программу для открытия вашего файла GUI.

В случае, если ваш файл GUI не открывается, весьма вероятно, что на вашем ПК не установлена необходимая прикладная программа для просмотра или редактирования файлов с расширениями GUI.

Если ваш ПК открывает файл GUI, но в неверной программе, вам потребуется изменить настройки ассоциации файлов в вашем реестре Windows. Другими словами, Windows ассоциирует расширения файлов GUI с неверной программой.

Установить необязательные продукты - FileViewPro (Solvusoft) | | | |

GUI Инструмент анализа файлов™

Вы не уверены, какой тип у файла GUI? Хотите получить точную информацию о файле, его создателе и как его можно открыть?

Теперь можно мгновенно получить всю необходимую информацию о файле GUI!

Революционный GUI Инструмент анализа файлов™ сканирует, анализирует и сообщает подробную информацию о файле GUI. Наш алгоритм (ожидается выдача патента) быстро проанализирует файл и через несколько секунд предоставит подробную информацию в наглядном и легко читаемом формате.†

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

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

Перетащите файл GUI сюда для начала анализа

Просмотреть мой компьютер »

Пожалуйста, также проверьте мой файл на вирусы

Ваш файл анализируется... пожалуйста подождите.

Для начала давайте ознакомимся с самим форматом, с которым нам предстоит работать. Формат Matroska (Матрёшка) изначально разрабатывался как открытый проект, призванный послужить альтернативой существующим проприетарным контейнерам. В итоге после нескольких лет разработки он вышел на рынок и стал быстро завоевывать популярность, особенно в интернет среде. Чем же был вызвал столь быстрый рост популярности? В первую очередь тем, что создатели прислушались к тому, что хотят видеть пользователи в своих видеофайлах и реализовали это. В подавляющем большинстве случаев от воспроизводимого видео файла требуется поддержка нескольких звуковых дорожек и субтитров. В формате mkv все это реализовано максимально просто и удобно. Вы можете поместить в контейнер сколько угодно альтернативных аудио файлов и субтитров а также переключаться между ними с помощью одного клика.

Давайте рассмотрим в каких случаях может возникнуть необходимость в применении программы . Например вы скачали фильм в котором в качестве основной дорожки идет файл с русским переводом, а другие дороги в том числе и английская идут отдельными файлами. А вам как раз надо оригинальная английская дорожка чтобы подтянуть свое знание языка. Можно конечно в процессе воспроизведения подключить и внешнюю дорогу, но у многих плееров бывают проблемы с этим, некоторые вообще не предоставляют такие возможности, в других это сделать можно, но достаточно сложно. Как быть в этом случае? Тут то нам и пригодится MKVmerge GUI. Ниже мы расскажем как быстро и легко добавить внешние дорожки в контейнер мкв и потом быстро и легко переключаться между ними в самом плеере.

Добавление дополнительных звуковых дорог в mkv контейнер

Эту процедуру мы будет проводить на примере программы MKVtoolnix 5.9 и мультфильма Secret of Kells. У нас есть оригинальный контейнер с двумя звуковыми дорожками и 4 внешние дополнительные дороги. Которые мы добавим к первым двум, чтобы на выходе получить один файл.

Вот так выглядит основное окно программы.

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

Как вы видите на скриншоте у нас в контейнере уже содержится 1 видеофайл в формате mpeg4, 2 аудиодороги (русская и английские комментарии), а также 21 файл субтитров и файл глав. Кроме этого мы хотим добавить в контейнер оригинальную английскую дорогу, еще 2 русских альтернативных перевода и 1 украинский. Для этого мы точно так же нажимаем кнопку добавить или перетаскиваем файлы мышью.

Теперь у нас во входных файлах 5 позиций. В принципе этого достаточно чтобы завершить формирование контейнера. Но можно сделать и небольшие улучшения. Как вы видите на скриншоте новые звуковые дороги добавились в самый конец списка, кроме того у них нет названия и не определен язык. Это можно исправить внеся соответствующие изменения. Во первых звуковые дорожки можно "подвинуть" вверх в списке, выделив их и нажав несколько раз кнопку "Вверх". Во вторых мы можем внести описания для них, введя соответсвующие данные в поле "Имя дорожки". Также мы можем указать язык дорожки в поле "Язык" и задать дорожку "по умолчанию" (это та, которая будет включаться автоматически при запуске видео).

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

На этом скриншоте вы видите программу в процессе обработки файла.

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

Это мощная система, которая позволяет оптимизировать работу над вашими проектами. Здесь нет каких-либо требований к языку или структуре файлов, поэтому у разработчиков полная свобода действий. В этой статье мы рассмотрим как пользоваться git для начинающих пользователей. Рассмотрим все очень подробно, начиная от настройки, и до ветвей проектов.

Уже по традиции, перед тем, как перейти к примерам и работе с командой давайте рассмотрим ее основные опции и параметры. Синтаксис git очень прост:

$ git опции команда аргументы

Сначала рассмотрим опции, они влияют на работу всей утилиты:

  • -C - использовать указанную папку репозитория вместо текущей папки;
  • -c параметр=значение - использовать указанное значение параметра конфигурации;
  • -p - прокручивать весь вывод с помощью less;

Теперь рассмотрим команды git, их немного больше и именно с помощью них вы будете выполнять все основные действия:

  • add - добавить файл или папку в репозиторий git;
  • am - применить все патчи из email;
  • archive - создать архив файлов;
  • bisect - использовать бинарный поиск для поиска нужного коммита;
  • branch - управление ветками проекта;
  • bundle - перемещение объектов и ссылок в архиве;
  • checkout - переключение между ветками;
  • cherry-pick - внести изменения в уже существующие коммиты;
  • clean - удалить все неотслеживаемые файлы и папки проекта;
  • clone - создать копию удаленного репозитория в папку;
  • commit - сохранить изменения в репозиторий;
  • diff - посмотреть изменения между коммитами;
  • fetch - скачать удаленный репозиторий;
  • init - создать репозиторий;
  • merge - объединить две ветви;
  • pull - интегрировать удаленный репозиторий с локальным;
  • push - отправить изменения в удаленный репозиторий;
  • tag - управление тегами;
  • worktree - управление деревями разработки.

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

Как работает git?

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

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

Как пользоваться Git?

Обычно, структура проекта в Git будет зависеть от масштаба и сложности вашей программы. Но для начала мы будем использовать проект, состоящий только из одной ветви. Каждый проект содержит одну ветку по умолчанию, она называется master. Наш первый проект будет называться test.

Создание проекта

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

mkdir -p ~/git/testing ; cd ~/git/testing

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

Проект готов, но система контроля версий git еще не знает об этом.

Настройка проекта в git

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

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

Если все прошло хорошо, то команда ничего не выведет.

Фиксация изменений

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

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

git commit -m "Initial Commit" -a

Команде необходимо передать два параметра, первый - это -m, ваш комментарий, второй -a, означает, что нужно применить действие ко всем измененным файлам. Для первого раза используется этот параметр, но обычно вам нужно указать измененные файлы или каталоги. Например, можно делать так:

git commit -m "Changed file" file

Отправка изменений

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

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

git remote add origin https://github.com/Seriyyy95/testing.git

Затем можно посмотреть список удаленных репозиториев:

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

git push origin master

Команда push указывает, что нужно отправить данные в удаленный репозиторий, origin - наш настроенный репозиторий, а master - ветвь.

Управление ветвями

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

Опция -a указывает что нужно вывести все ветви, даже не синхронизированные. Звездочка указывает на активную ветвь. Теперь создадим ветвь для разработки с помощью команды checkout:

git checkout -b develop

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

git checkout master
$ git checkout develop

Теперь создадим еще один файл:

И добавим его в нашу новую ветвь develop:

Сделаем коммит для внесенных изменений:

git commit -m "develop file" develop

git branch
$ ls

Затем переключаемся на ветку master и снова смотрим:

git checkout master
$ git branch
$ ls

Здесь файла нет, так и должно быть. В git есть такая полезная вещь, как слияние. С помощью нее вы можете объединить две ветви. Например, переместить код из рабочей ветки в стабильную. Для этого достаточно выполнить команду merge:

git merge develop --no-ff

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

Выводы

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

Эта статья предназначена для тех, кто только начинает своё знакомство с созданием приложений с графическим интерфейсом (GUI) на Python. В ней мы рассмотрим основы использования PyQt в связке с Qt Designer. Шаг за шагом мы создадим простое Python GUI приложение, которое будет отображать содержимое выбранной директории.

Что нам потребуется

Нам понадобятся PyQt и Qt Designer, ну и Python, само собой.

В этой статье используется PyQt5 с Python 3, но особых различий между PyQt и PySide или их версиями для Python 2 нет.

Linux: Всё нужное, вероятно, есть в репозиториях вашего дистрибутива. Qt Designer можно установить из Центра Приложений, но PyQt придётся устанавливать через терминал. Установить всё, что нам понадобится, одной командой можно, например, так:

# для Fedora: $ sudo dnf install python3-qt5 qt-creator # для Debian/Ubuntu: $ sudo apt install python3-qt5 pyqt5-dev-tools qtcreator

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

$ pyuic5 Error: one input ui-file must be specified

Если вы видите сообщение, что такой команды нет или что-то в таком роде, попробуйте загуглить решение проблемы для вашей операционной системы и версии PyQt.

Если вы используете Windows, то, скорее всего, путь C:\Python36\Scripts (измените 36 на вашу версию Python) не прописан в вашем PATH . Загляните в этот тред на Stack Overflow, чтобы узнать, как решить проблему.

Дизайн

Основы

Теперь, когда у нас всё готово к работе, давайте начнём с простого дизайна.

Откройте Qt Designer, где вы увидите диалог новой формы, выберите Main Window и нажмите Create .

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

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

Все элементы формы и их иерархия по умолчанию отображаются в правой части окна Qt Designer под названием Object Inspector . Вы с лёгкостью можете удалять объекты, кликая по ним правой кнопкой мыши в этом окне. Или же вы можете выбрать их в основной форме и нажать клавишу DEL на клавиатуре.

В итоге мы имеем почти пустую форму. Единственный оставшийся объект - centralwidget , но он нам понадобится, поэтому с ним мы ничего не будем делать.

Теперь перетащите куда-нибудь в основную форму List Widget (не List View ) и Push Button из Widget Box .

Макеты

Вместо использования фиксированных позиций и размеров элементов в приложении лучше использовать макеты. Фиксированные позиции и размеры у вас будут выглядеть хорошо (пока вы не измените размер окна), но вы никогда не можете быть уверены, что всё будет точно так же на других машинах и/или операционных системах.

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

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

Теперь в меню Qt Designer нажмите Form , затем выберите Preview и увидите что-то похожее на скриншот выше. Выглядит хорошо, не так ли? Но вот что случится, когда мы изменим размер окна:

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

Основное окно уже поддерживает макеты, поэтому нам ничего не нужно добавлять в нашу форму. Просто кликните правой кнопкой мыши по Main Window в Object Inspector и выберите Lay out Lay out vertically . Также вы можете кликнуть правой кнопкой по пустой области в форме и выбрать те же опции:

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

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

Если у вас не получается переместить элемент в главном окне, вы можете сделать это в окне Object Inspector .

Последние штрихи

Теперь, благодаря вертикальному размещению, наши элементы выровнены правильно. Единственное, что осталось сделать (но не обязательно), - изменить имя элементов и их текст.

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

Свойства элементов можно изменить в разделе Property Editor .

Подсказка: вы можете менять размер, передвигать или добавлять часто используемые элементы в интерфейс Qt Designer для ускорения рабочего процесса. Вы можете добавлять скрытые/закрытые части интерфейса через пункт меню View .

Нажмите на кнопку, которую вы добавили в форму. Теперь в Property Editor вы должны видеть все свойства этого элемента. В данный момент нас интересуют objectName и text в разделе QAbstractButton . Вы можете сворачивать разделы в Property Editor нажатием по названию раздела.

Измените значение objectName на btnBrowse и text на Выберите папку .

Должно получиться так:

Именем объекта списка является listWidget , что вполне подходит в данном случае.

Сохраните дизайн как design.ui в папке проекта.

Превращаем дизайн в код

Конечно, можно использовать.ui -файлы напрямую из Python-кода, однако есть и другой путь, который может показаться легче. Можно конвертировать код.ui -файла в Python-файл, который мы потом сможем импортировать и использовать. Для этого мы используем команду pyuic5 из терминала/командной строки.

Чтобы конвертировать.ui -файл в Python-файл с названием design.py , используйте следующую команду:

$ pyuic5 path/to/design.ui -o output/path/to/design.py

Пишем код

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

Создайте файл main.py в папке, где находится design.py .

Используем дизайн

Для Python GUI приложения понадобятся следующие модули:

Import sys # sys нужен для передачи argv в QApplication from PyQt5 import QtWidgets

Также нам нужен код дизайна, который мы создали ранее, поэтому его мы тоже импортируем:

Import design # Это наш конвертированный файл дизайна

Так как файл с дизайном будет полностью перезаписываться каждый раз при изменении дизайна, мы не будем изменять его. Вместо этого мы создадим новый класс ExampleApp , который объединим с кодом дизайна для использования всех его функций:

Class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow): def __init__(self): # Это здесь нужно для доступа к переменным, методам # и т.д. в файле design.py super().__init__() self.setupUi(self) # Это нужно для инициализации нашего дизайна

В этом классе мы будем взаимодействовать с элементами интерфейса, добавлять соединения и всё остальное, что нам потребуется. Но для начала нам нужно инициализировать класс при запуске кода. С этим мы разберёмся в функции main() :

Def main(): app = QtWidgets.QApplication(sys.argv) # Новый экземпляр QApplication window = ExampleApp() # Создаём объект класса ExampleApp window.show() # Показываем окно app.exec_() # и запускаем приложение

И чтобы выполнить эту функцию, мы воспользуемся привычной конструкцией:

If __name__ == "__main__": # Если мы запускаем файл напрямую, а не импортируем main() # то запускаем функцию main()

В итоге main.py выглядит таким образом:

Import sys # sys нужен для передачи argv в QApplication from PyQt5 import QtWidgets import design # Это наш конвертированный файл дизайна class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow): def __init__(self): # Это здесь нужно для доступа к переменным, методам # и т.д. в файле design.py super().__init__() self.setupUi(self) # Это нужно для инициализации нашего дизайна def main(): app = QtWidgets.QApplication(sys.argv) # Новый экземпляр QApplication window = ExampleApp() # Создаём объект класса ExampleApp window.show() # Показываем окно app.exec_() # и запускаем приложение if __name__ == "__main__": # Если мы запускаем файл напрямую, а не импортируем main() # то запускаем функцию main()

Если запустить этот код: $ python3 main.py , то наше приложение запустится!

Но нажатие на кнопку ничего не даёт, поэтому нам придётся с этим разобраться.

Добавляем функциональность в наше Python GUI приложение

Примечание Весь дальнейший код пишется внутри класса ExampleApp .

Начнём с кнопки Выберите папку . Привязать к функции событие вроде нажатия на кнопку можно следующим образом:

Self.btnBrowse.clicked.connect(self.browse_folder)

Добавьте эту строку в метод __init__ класса ExampleApp , чтобы выполнить привязку при запуске приложения. А теперь взглянем на неё поближе:

  • self.btnBrowse: здесь btnBrowse - имя объекта, который мы определили в Qt Designer. self говорит само за себя и означает принадлежность к текущему классу;
  • clicked - событие, которое мы хотим привязать. У разных элементов разные события, например, у виджетов списка есть itemSelectionChanged и т.д.;
  • connect() - метод, который привязывает событие к вызову переданной функции;
  • self.browse_folder - просто функция (метод), которую мы описали в классе ExampleApp .

Для открытия диалога выбора папки мы можем использовать встроенный метод QtWidgets.QFileDialog.getExistingDirectory:

Directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите папку")

Если пользователь выберет директорию, переменной directory присвоится абсолютный путь к выбранной директории, в противном случае она будет равна None . Чтобы не выполнять код дальше, если пользователь закроет диалог, мы используем команду if directory: .

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

Import os

И получить список содержимого следующим образом:

Os.listdir(path)

Для добавления элементов в listWidget мы используем метод addItem() , а для удаления всех элементов у нас есть self.listWidget.clear() .

В итоге функция browse_folder должна выглядеть так:

Def browse_folder(self): self.listWidget.clear() # На случай, если в списке уже есть элементы directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите папку") # открыть диалог выбора директории и установить значение переменной # равной пути к выбранной директории if directory: # не продолжать выполнение, если пользователь не выбрал директорию for file_name in os.listdir(directory): # для каждого файла в директории self.listWidget.addItem(file_name) # добавить файл в listWidget

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

Так выглядит весь код нашего Python GUI приложения:

Import sys # sys нужен для передачи argv в QApplication import os # Отсюда нам понадобятся методы для отображения содержимого директорий from PyQt5 import QtWidgets import design # Это наш конвертированный файл дизайна class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow): def __init__(self): # Это здесь нужно для доступа к переменным, методам # и т.д. в файле design.py super().__init__() self.setupUi(self) # Это нужно для инициализации нашего дизайна self.btnBrowse.clicked.connect(self.browse_folder) # Выполнить функцию browse_folder # при нажатии кнопки def browse_folder(self): self.listWidget.clear() # На случай, если в списке уже есть элементы directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Выберите папку") # открыть диалог выбора директории и установить значение переменной # равной пути к выбранной директории if directory: # не продолжать выполнение, если пользователь не выбрал директорию for file_name in os.listdir(directory): # для каждого файла в директории self.listWidget.addItem(file_name) # добавить файл в listWidget def main(): app = QtWidgets.QApplication(sys.argv) # Новый экземпляр QApplication window = ExampleApp() # Создаём объект класса ExampleApp window.show() # Показываем окно app.exec_() # и запускаем приложение if __name__ == "__main__": # Если мы запускаем файл напрямую, а не импортируем main() # то запускаем функцию main()

Это были основы использования Qt Designer и PyQt для разработки Python GUI приложения. Теперь вы можете спокойно изменять дизайн приложения и использовать команду pyuic5 без страха потерять написанный код.

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

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

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

Приложение с графическим интерфейсом может быть написано и без применения среды GUIDE. В качестве примера, можно привести bspligui, входящее в состав Spline ToolBox. Желающим разобраться в создании приложений без среды GUIDE можно посоветовать запустить приложение bspligui в режиме отладки, проследить за созданием окна приложения, элементов управления и способе обработки событий (достаточно открыть файл bspligui.m, установить точку останова на первую исполняемую строку и запустить приложение). К этому вопросу мы со временем обратимся.

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

· "MATLAB: Creating Graphical User Interfaces".

· "MATLAB: Functions -- Categorical List: Creating Graphical User Interfaces"

· "MATLAB: Handle Graphics Property Browser" (справочник свойств графических объектов).

· В справочной системе MatLab 7 в разделе "Demo" есть 10-ти минутная демонстрация создания приложения с графическим интерфейсом в среде GUIDE.

В качестве простейшего примера рассмотрим создание в среде GUIDE приложения с кнопкой Hello , нажатие на которую приводит к выводу текста "Hello, World!" в окно приложения.

Создание приложения hello в среде GUIDE

Требуется создать приложение с графическим интерфейсом hello, запуск которого, например из командной строки

приводил бы к появлению окна приложения с кнопкой Hello (см. рис 1.a). После нажатия на Hello в окно приложения выводится текст "Hello, World!" (см. рис 1.b).

Рис. 1. Работа приложения hello

Перейдите в среду GUIDE, выполнив команду

При этом появляется диалоговое окно GUIDE Quick Start (см. рис. 2). У него две вкладки.

  • Вкладка Create New GUI (создание нового приложения), которая нам сейчас понадобится. На ней можно выбрать четыре заготовки: Blank GUI (пустое окно приложения), GUI with Uicontrols (заготовка с кнопками, переключателями и областями ввода), GUI with Axes and Menu (заготовка с осями, меню, кнопкой и раскрывающимся списком), Modal Question Dialog (заготовка для модального окна).
  • Вкладка Open Existing GUI (открытие существующего приложения).

Кроме того, внизу вкладки Create New GUI есть флаг, установка которого позволяет сразу задать имя файла, в котором будет храниться графический интерфейс. Но приложение всегда можно будет сохранить в процессе редактирования, поэтому этот флаг устанавливать не обязательно.

Рис. 2. Диалоговое окно GUIDE Quick Start

Выберите на вкладке Create New GUI строку Blank GUI и нажмите OK. При этом появляется основное окно среды GUIDE, содержащее заготовку для окна приложения, панель инструментов для добавления элементов интерфейса, управляющую панель и меню (см. рис. 3).

Рис. 3. Среда GUIDE с заготовкой для окна приложения

Сначала добавьте кнопку на заготовку окна приложения. Для этого при помощи мыши выберите инструмент Push Button (его пиктограмма содержит кнопку OK, а имя появляется на всплывающей подсказке) и щелчком мыши поместите кнопку на заготовку окна приложения (см. рис. 4)

Рис. 4. Добавление кнопки на заготовку окна приложения

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

Для задания тега следует перейти к инспектору свойств. Проще всего это сделать двойным щелчком мыши по добавленной кнопке. При этом появляется окно инспектора свойств (Property Inspector), в котором отображены свойства кнопки (объекта Uicontrol). Найдите в левом столбце таблицы свойство Tag и в области ввода справа от него измените текущее значение pushbutton1 на btnHello и нажмите . Всегда лучше давать объектам содержательные теги!

Заметьте, что тег и надпись на кнопке не одно и то же. Сразу же в окне инспектора свойств измените надпись, обратившись к свойству String. Вместо Push Button должно быть Hello.

Наше приложение должно выводить текст. Но текст нельзя просто вывести в графическое окно, поскольку текстовый объект является потомком осей. Мы не будем сейчас размещать оси, а поступим по-другому. Расположите в окне приложения элемент управления - Static Text (статический текст, или область для вывода текста). Для этого воспользуйтесь инструментом Static Text так же, как и при добавлении кнопки (см. рис. 5).

Примечание

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

Рис. 5. Добавление области вывода текста

Задайте тег txtWin области вывода текста, а ее свойство String установите в пустую строку, просто удалив в инспекторе свойств то значение, которое присваивается по умолчанию.

Обратите внимание, что области вывода текста является графическим объектом Uicontrol, так же, как и кнопка (это написано вверху инспектора свойств). Вид элемента управления, т.е. объекта Uicontrol определяется значением его свойства Style. Для кнопки оно принимает значение "pushbutton", для области вывода текста "text".

Предположим, что наше приложение уже работает. При нажатии пользователем на кнопку Hello возникнет ее событие Callback, которое пока не запрограммировано. Очевидно, что при возникновении события Callback необходимо установить свойство String области вывода текста в значение "Hello, World!" и задать цвет и размер шрифта.

Перед программированием события сохраните приложение. Для этого в меню File среды GUIDE выберите пункт Save as, появляется диалоговое окно сохранения файла, в котором выберите папку или создайте новую и задайте имя файла hello (автоматически добавится расширение fig). Обратите внимание, что после сохранения приложения в редакторе M-файлов открылся файл hello.m. По умолчанию, приложение содержится в двух файлах: с расширением fig (графическое окно с размещенными на нем элементами управления) и с расширением m (файл-функция hello с подфункциями, которые обрабатывают различные события, возникающие в ходе взаимодействия приложения с пользователем).

Приступим к программированию события Callback кнопки Hello. Для этого перейдите к заготовке окна приложения и в контекстном меню кнопки выберите в пункте View Callbacks подпункт Callback. При этом происходит переход в редактор M-файлов к подфункции обработки события btnHello_Callback, заголовок которой и комментарии генерируется автоматически:

% --- Executes on button press in btnHello.
function btnHello_Callback(hObject, eventdata, handles)
% hObject handle to btnHello (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

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

Имя файл-функции состоит из тега объекта (btnHello), событие Callback которого будет обрабатываться и названия события Callback (есть и другие события). Смысл ее входных аргументов следующий.

· Аргумент hObject содержит указатель на кнопку Hello, т.е. объект Uicontrol с тегом btnHello (он нам сейчас не понадобится).

· Аргумент eventdata зарезервирован для использования в следующих версиях MatLab.

· Аргумент handles является структурой с указателями на все объекты приложения. Поля структуры handles являются тегами этих объектов. Так handles.btnHello содержит указатель на кнопку Hello, handles.figure1 - указатель на окно приложения, handles.txtWin - указатель на область вывода текста (как раз этот указатель нам сейчас и пригодится).

Приступим теперь к программированию события Callback кнопки Hello. После заголовка подфункции btnHello_Callback разместите операторы, которые изменяют значение свойства String области вывода текста (объекта Uicontrol), устанавливая его в "Hello, World!", а также цвета и размера шрифта. За цвет и размер шрифта отвечают свойства ForegroundColor и FontSize объекта Uicontrol. Размер шрифта указывается в единицах измерения, заданных свойством FontUnits (по умолчанию пункты, 1пт=1/72дюйма). Свойства графических объектов задаются при помощи функции set.

Итак, подфункция btnHello_Callback должна выглядеть так (автоматически сгенерированные комментарии убраны):

function btnHello_Callback(hObject, eventdata, handles)
% размещение текста
set(handles.txtWin,"String","Hello, World!")
% задание красного цвета текста
set(handles.txtWin,"ForegroundColor","r")
% задание размера шрифта 16пт
set(handles.txtWin,"FontSize",16)

Теперь приложение hello можно запустить, воспользовавшись кнопкой Run на панели управления среды GUIDE. Перед запуском может появится окно, приведенное на рис. 6, в котором говорится о том, что папка с файлами приложения не является текущей. В этом окне можно либо сделать ее текущей (переключатель Change MATLAB current directory), либо добавить папку в начало пути поиска MATLAB (переключатель Add directory to the top of the MATLAB path), либо в конец пути поиска (переключатель Add directory to the bottom of the MATLAB path). Установите верхний переключатель (как по умолчанию), вряд ли стоит добавлять папку с таким простым приложением в путь поиска. Скорее всего оно не часто будет нужно.

Рис. 6. Диалоговое окно с сообщением о том, что папка с файлами приложения не является текущей.

Нажатие на кнопку Hello в работающем приложении приводит к появлению надписи "Hello, World!" вверху окна. Закройте работающее приложение, нажав на кнопку с крестиком на заголовке окна. Вы снова находитесь в режиме редактирования. Можно добавлять элементы управления на заготовку окна приложения, задавать их теги и другие свойства, программировать события, запускать приложение и смотреть на результат. Например, уменьшите окно приложения в среде GUIDE (как на рис. 1) и запустите приложение снова.

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

Среда GUIDE предлагает ряд средств, которые облегчают проектирование приложения:

· сетку с возможностью привязки объектов к ней, линейки и линии выравнивания (меню Tools, пункт Grid and Rules);

· инструменты выравнивания объектов (меню Tools, пункт Align Objects или кнопка Align Objects на панели управления среды GUIDE);

В среду GUIDE входят также:

· редактор меню, который позволяет создавать меню приложения и контекстные меню (меню Tools, пункт Menu Editor или кнопка Menu Editor на панели управления среды GUIDE);

· браузер объектов для быстрого перехода к их свойствам (кнопка Object Browser на панели управления среды GUIDE)

· редактор порядка обхода элементов управления клавишей Tab (меню Tools, пункт Tab Order Editor или кнопка Tab Order Editor на панели управления среды GUIDE).

Вызов инспектора свойств происходит не только после двойного щелчка мышью по объекту, но также из контекстного меню объекта, или при помощи кнопки Property Inspector на панели управления среды GUIDE.

Запуск приложения без среды GUIDE и редактирование

Разумеется, созданное в предыдущем разделе приложение hello не требует для запуска среду GUIDE. Закройте окно среды GUIDE (если оно открыто) и перейдите в командное окно MatLab. Убедитесь, что папка с приложением является текущей (она должна быть выбрана в раскрывающемся списке Current Directory рабочей среды MatLab). Если это не так, то сделайте ее текущей, воспользовавшись кнопкой справа от раскрывающегося списка Current Directory, или окном Current Directory .

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

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

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

1. Запустить среду GUIDE командой guide и в появляющемся диалоговом окне GUIDE Quick Start (см. рис. 2 предыдущего раздела) перейти ко вкладке Open Existing GUI и выбрать приложение.

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

>> guide("hello.fig")

При таком способе папка с приложением должна быть текущей, или содержаться в пути поиска MatLab.

Как работает приложение, созданное в среде GUIDE?

Это важный вопрос для тех, кто хочет создавать сложные приложения. Если Ваша цель состоит в написании простых приложений, то достаточно научиться размещать элементы интерфейса и программировать их события в подфункциях так, как описано выше в разделе "Создание приложения hello в среде GUIDE". Простое приложение состоит из одного основного окна, которое содержит различные элементы управления, области вывода текстовой информации и оси. Использование стандартных диалоговых окон облегчает работу с файлами, ввод данных, выбор шрифта, цвета и печать результатов. Однако, если Вы планируете программировать многооконные приложения, то прочтите этот раздел сейчас, или вернитесь к нему по мере надобности.

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

>> guide("hello.fig")

Откройте в редакторе M-файлов файл-функцию hello. Это функция с переменным числом входных и выходных аргументов, ниже она приведена без автоматически созданных комментариев и подфункций.

function varargout = hello(varargin)

Gui_Singleton = 1; gui_State = struct("gui_Name", mfilename, ... "gui_Singleton", gui_Singleton, ... "gui_OpeningFcn", @hello_OpeningFcn, ... "gui_OutputFcn", @hello_OutputFcn, ... "gui_LayoutFcn", , ... "gui_Callback", ); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end

Поставьте точку останова в редакторе M-файлов в строке с первым исполняемым оператором gui_Singleton = 1. Запустите приложение hello, например, из командной строки:

и выполните операторы hello по шагам используя F10 (или кнопку Step).

Сначала переменной gui_Singleton присваивается 1, затем формируется структура gui_State с полями:

  • gui_Name - имя M-файла с работающей в данный момент файл-функцией приложения, которое возвращается функцией mfilename;
  • gui_Singleton - сколько копий приложения может быть запущено одновременно, в нашем случае это поле содержит 1, это значит, что может быть запущена только одна копия приложения (0 означает, что может быть одновременно запущено несколько копий);
  • gui_OpeningFcn - указатель на подфункцию hello_OpeningFcn (в файле hello.m), выполняющуюся перед тем, как окно приложения появится на экране;
  • gui_OutputFcn - указатель на подфункцию hello_OutputFcn (в файле hello.m), которая определяет, что возвращает функция hello, вызванная с выходным аргументом (по умолчанию, указатель на графическое окно приложения);
  • gui_LayoutFcn - по умолчанию пустой массив, может быть указателем на функцию, которая определяет способ появления приложения.
  • gui_Callback - пока пустой массив, при возникновении события от некоторого элемента управления будет содержать указатель на функцию hello c необходимыми входными аргументами, которые и определят исполняемую подфункцию в hello.m.

После заполнения структуры gui_State проверяется, была ли функция hello вызвана со входными аргументами (nargin содержит число входных аргументов) и является ли первый из них строкой. При запуске приложения входных аргументов не было. Они появляются при возникновении событий от элементов управления. Действительно, если в инспекторе свойств отобразить свойства кнопки Hello и посмотреть значение ее свойства Callback, то станет понятно, что при возникновении события Callback кнопки вызывается функция hello: hello("btnHello_Callback",gcbo,,guidata(gcbo)). Тогда в поле gui_Callback структуры gui_State заносится соответствующий указатель при помощи функции str2func.

Примечание

Функция str2func конструирует указатель на функцию, заданную строкой, например:
>> f=str2func("exp")

F = @exp

Следующий оператор if проверяет, была ли функция hello вызвана со выходными аргументами (nargout содержит число входных аргументов) и вызывает специальную функцию gui_mainfcn от структуры gui_State и входных аргументов hello. При первом вызове входных аргументов не было и gui_mainfcn создаст окно приложения. Последующие вызовы hello со входными аргументами, вызванные возникновением событий от элементов управления, приведут к обращению к соответствующим подфункциям обработки событий в hello.m. Это можно проследить пошаговым выполнением в редакторе M-файлов.

Примечание

Функция gui_mainfcn имеет открытый код и расположена в подкаталоге \toolbox\matlab\uitools\ основного каталога MatLab.