Графическое приложение: Урок № 26. Первое графическое приложение
Урок № 26. Первое графическое приложение
Создание первого приложения с графическим интерфейсом
Доброго времени суток! В этом уроке мы создадим Ваше первое приложение с графическим интерфейсом в MS Visual Studio. Это будет своего рода «Hello World» для графических приложений. Скажу сразу, что использование Windows Forms — не единственный способ создания графических приложений (приложения с графическим интерфейсом пользователя) для C# программистов, но начать изучение лучше именно с этого. И так, запускаем Visual Studio.
Запустили? Тогда к делу! Идем в главное меню и выбираем пункт «Файл — Создать — Проект», как показано на рисунке ниже.
Создание нового проекта
В появившемся окне:
- в левой части выбираем «Шаблоны — Visual C# — Windows»;
- в основной области выбираем элемент «Приложение Windows Forms»;
- в нижней части окна вводим имя проекта и указываем его расположение на диске.
В общем, как показано на рисунке ниже.
Опции создания проекта
Указали что нужно? Тогда нажимайте на кнопку «OK». Теперь вы должны увидеть примерно следующее (основные области выделены прямоугольниками):
Только что созданный проект
На рисунке выше, я обозначил основные области: область дизайнера (слева вверху), область обозревателя решений (справа вверху) и область свойств (справа внизу). С этими областями, мы будем работать чаще всего.
В области дизайнера, сейчас располагается пустая «форма», это так называемое окно, в данном случае, главное окно нашей программы. В области свойств, отображаются свойства выделенного в дизайнере элемента, в данном случае, нашей формы, ну а область обозревателя решений, содержит файлы проекта, в том числи, относящиеся и к формам (окнам) программы. А теперь, давайте немного изменим нашу форму, и запустим это первое приложение.
Для этого, выделим в дизайнере форму (для этого, можно просто кликнуть левой кнопкой мыши по форме) и перейдем в блок свойств, в котором найдем строку «Text» (слово текст, ищем в левом столбце), как показано на рисунке ниже.
Свойство «Text» основной формы приложения
Обратите внимание, в левом столбце указано имя (название свойства), а в правом — его значение.
В данном случае, мы имеем дело с текстовым свойством, и его значение, отображается в заголовке окна, так что, давайте теперь укажем там что-то свое, например, что-то вроде: «Главное окно», как показано на рисунке ниже:
Установка свойства формы
Теперь, можно собрать проект и запустить. Для этого идем в главное меню и выбираем пункт «Сборка — Собрать решение». А потом запускаем приложение, для этого выбираем пункт «Отладка — Запуск без отладки» в главном меню. В результате Вы должны увидеть окно следующее окно.
Окно первого графического приложения
В следующем уроке, мы рассмотрим простую работу с дизайнером форм, и настройку элементов графического интерфейса, а на этот урок подошел к концу, мы создали первое графическое приложение, собрали и запустили его.
Перейти к следующему уроку
Пишем графическое приложение на Python
Вы здесь: Главная — Python — Основы Python — Пишем графическое приложение на Python
В этой небольшой статье я хочу показать Вам насколько быстро можно прототипировать графические приложения на Python. А так как Python — это язык многоцелевой, то создание на нем графических приложений для сайтов не составляет большого труда.
Для Python существуют различные библиотеки для создания графического интерфейса пользователя, но мы в рамках данной статьи рассмотрим самые основы только одной из них — Tkinter. Мы создадим окно и добавим на него виджеты:
from tkinter import *
window = Tk()
window.title("GUI Приложение")
window.mainloop()
Теперь давайте разместим в окне метку (Label):
// window - это ссылка на окно
lbl = Label(window, text="Привет")// размещаем метку на определенной позиции
lbl. grid(column=0, row=0)
Все вмесет это будет выглядить так:
from tkinter import *
window = Tk()
window.title("Привет из Приложения") lbl = Label(window, text="Привет")
lbl.grid(column=0, row=0)
// запуск приложения
window.mainloop()
А вот другой пример с кнопкой:
from tkinter import *
window = Tk()
window.title("Привет из Приложения")
// размер окна задается так
window.geometry('350x200')
lbl = Label(window, text="Привет")
lbl.grid(column=0, row=0)
// кнопка
btn = Button(window, text="Нажмите")
btn.grid(column=1, row=0)
window.mainloop()
- Создано 19.11.2019 13:56:49
- Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
<a href=»https://myrusakov.ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a> -
Текстовая ссылка:
<a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
[URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]
Введение в разработку графического интерфейса
Для выполнения программы в среде IDE выполните следующие действия:
Выберите Run («Запуск») > Run Main Project («Запуск главного проекта») (как вариант, нажмите F6).
Примечание. При открытии окна с указанием того, что для Project NumberAddition не задан основной класс, следует выбрать my.NumberAddition.NumberAdditionUI
в качестве основного класса в том же окне и нажать кнопку ОК.
Для запуска программы вне среды IDE выполните следующие действия:
Для сборки архива JAR приложения выберите «Run > Clean and Build Main Project» (Shift-F11).
При помощи проводника по файловой системе или диспетчера файлов перейдите в каталог ` NumberAddition/dist`.
Примечание. Местоположение каталога проекта NumberAddition
зависит от пути, указанного при создании проекта в шаге 3 в разделе Упражнение 1. Создание проекта.
Дважды щелкните файл
NumberAddition.jar
.
Через несколько секунд приложение запустится.
Примечание. Если при двойном щелчке файла JAR не выполняется запуск приложения, дополнительные сведения о настройке связей файлов JAR в используемой операционной системе см эту статью.
Можно также запустить приложение из командной строки.
Для запуска приложения из командной строки выполните следующие действия:
Вызовите командную строку или окно терминала.
В командной строке измените текущий каталог на каталог
. NumberAddition/distВ командной строке введите следующий оператор:
java -jar NumberAddition.jar
Примечание. Убедитесь, что my.NumberAddition.NumberAdditionUI
задан как основной класс до запуска приложения. Для провери этого, щелкните правой кнопкой узел мыши узел проекта NumberAddition на панели ‘Проекты’, выберите ‘Свойства’ во всплывающем меню и выберите категорию ‘Выполнить’ в диалоговом окне ‘Свойства проекта’. В поле ‘Основной класс’ должно отображаться my.numberaddition.NumberAdditionUI
.
Графическое приложение на Windows и Linux
Интересно, доступен ли настольный Kornshell (DtKsh) для Linux и Windows.
Еще в 1990-х годах Desktop Kornshell стал частью CDE (Common Desktop Environment). Это была попытка Unix systems представить унифицированный рабочий стол GUI, чтобы конкурировать с Windows. Ты же знаешь, как хорошо это сработало.
Ksh 93 и BASH разделяют около 99% своего синтаксиса. (Черт возьми, мне даже больше нравится Ksh, но потом я вспоминаю свой первый жесткий диск-потрясающую модель 20 мг, которая была всего 5 дюймов в размере. Как они умудрились сделать их такими маленькими?). Однако Desktop Kornshell добавляет слой GUI поверх слоя Ksh 93. Вы можете взять свой стандартный скрипт Ksh и просто добавить слой GUI прямо сверху. Я сделал это с помощью нескольких моих сценариев Kornshell. Даже написал графическую почтовую программу, основанную на почтовом обработчике(MH).
К сожалению, самый простой способ получить dtksh-это взять машину времени обратно в 1994 год.
Кроме того, я действительно не знаю, доступен ли еще DtKsh. Я считаю, набор инструментов МКС-прежнему поставляется с DtKsh. MSK Toolkit похож на Cygwin, если вы взяли несколько сотен долларов за Cygwin. Я сомневаюсь, что у Cygwin есть пакет DtKsh (может быть, у них есть). Дистрибутивы Linux обычно поставляются с пакетами DtKsh, но они, возможно, пошли по пути пакетов UUCP, SCCS и RCS.
Однако, если DtKsh доступен, это будет ваш лучший выбор. Вы можете легко изменить свои сценарии Bash, чтобы обеспечить приятный интерфейс GUI.
Я знаю, что кто-то упомянул Mono и C#,, но для этого требуется сервер .NET. Это означает, что вам нужно не только переписать все, но и настроить сервер IIS.
Java, вероятно, будет вашим первым выбором. Java-это мощный язык, и Java разработчиков довольно легко найти. Фреймворк Swing поставляется с Java и обеспечивает адекватный GUI. У меня есть несколько приложений Swing (например, мой браузер LDAP), которые я использую довольно часто. К сожалению, большинство разработчиков Java никогда не касались Swing.
Python также поставляется с GUI shell, но, вероятно, меньше разработчиков Python, которые использовали GUI shell, чем разработчиков Java, которые использовали Swing. Тем не менее, Python-это популярный язык, и есть много доступных ресурсов и разработчиков. Кроме того, зная разработчиков Python и Java, я бы сказал, что вам может повезти больше, если вы заставите разработчика Python изучать программирование Python GUI, чем разработчика Java изучать Swing.
Итак, ваш лучший выбор-посмотреть, сможете ли вы все еще получить DtKsh. Если нет, я бы выбрал Java или Python.
Обзор графических библиотек C++
Графические библиотеки для C++ позволяют сделать разработку UI приложений максимально быстрой и удобной. Рассказываем, на какие стоит обратить внимание.
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
- SFML
- Qt
- Cairo
- Cocos2D-X
- Juce
- wxWidgets
- SDL 2. 0
- GTK+
- Заключение
SFML
SFML (Simple and Fast Multimedia Library) — одна из самых удобных и быстрых графических библиотек для C++. Её неоспоримое преимущество — минимальные требования к уровню знаний языка и лёгкость освоения: всего за несколько дней можно написать вполне полноценную программу. К примеру, первое графическое приложение «SFML works!» можно написать всего за минуту. Ещё одно преимущество — кроссплатформенность: SFML работает под Windows, Linux (только X11, но не Wayland) и Mac OS, планируется выход под Android и iOS.
SFML библиотека используется по большей части небольшими стартапами и программистами, для которых создание игр — хобби. SFML популярен среди небольших команд благодаря тому, что разработка графической части программы не требует написания больших объёмов кода.
Попробуйте пройти начальный курс.
Qt
Qt представляет собой целый набор инструментов для быстрого и удобного проектирования GUI. Конечно же, здесь можно писать и игры — почему бы и нет? — но Qt привлекает программистов в основном тем, что она является быстрой, удобной, гибкой и кроссплатформенной. Во многом Qt обогнала даже SFML: библиотека доступна как на Windows, Linux и Mac OS, так и на мобильных платформах — Windows Mobile, Android и iOS.
Qt расширяет C++ с помощью МОК (Мета-объектного компилятора) и предоставляет дополнительные функции (например, сигналы и слоты). Также имеет платную службу поддержки (как и платную лицензию). Для Qt есть большой выбор IDE: QtDesigner, QtCreator, QDevelop, Edyuk, а также доступна интеграция с Visual Studio, Eclipse и XCode.
Qt является open source продуктом, в разработке которого можно принять участие. О других open source проектах для C++ читайте в нашей статье.
Вы можете пройти готовый курс по данной библиотеке.
Cairo
Cairo — библиотека для отрисовки векторных изображений под Linux, Windows и Mac OS. К примеру, такой крупный проект, как Mozilla, использует Cairo в браузерном движке Gecko. Также Cairo лежит в основе некоторых операционных систем (MorphOS, AmigaOS) и приложений (InkScape, Synfig, Graphite). При использовании библиотеки будьте готовы к отсутствию русскоязычных ресурсов.
Cairo может взаимодействовать с OpenGL бэкендом с поддержкой GPU, что, конечно, открывает целый список полезных функций.
Cocos2D-X
Кроссплатформенная библиотека Cocos2D-X призвана упростить разработку мобильных игр. Поддерживает все те же платформы, что и Qt. Из плюсов стоит отметить доступность, удобство эксплуатации и создание отдельного конструктора игр, основанного на библиотеке Cocos Creator. В списке игр, основанных на движке, есть всемирно известная BADLAND, работающая на всех доступных платформах.
Если при создании игры вам нужно работать с графикой и анимацией в больших объёмах, то лучше использовать Unity вместо Cocos2D-X. Unity имеет возможность плавной интеграции с такими инструментами, как Photoshop, Maya или Blender. В Cocos2D-X вся графика добавляется извне и на неё ссылаются из кода.
В Рунете нет уроков по этой библиотеке, но на английском языке есть отличный курс от разработчиков.
Juce
Juce — кроссплатформенный фреймворк, предназначенный для создания приложений и плагинов на языке C++.
Документации по Juce много, но не на русском языке. Поэтому можно скачать книгу «Программирование на C++ с JUCE 4.2.x: Создание кроссплатформенных мультимедийных приложений с использованием библиотеки JUCE на простых примерах».
Juce больше популярен среди разработчиков аудио — ПО благодаря набору интерфейсов-оболочек для построения аудио плагинов.
wxWidgets
wxWidgets — одна из старейших, но в то же время наиболее известных графических библиотек для отрисовки GUI. Её основной плюс — производительность. Если QT использует низкоуровневый код лишь для таких элементов, как кнопки и полосы прокрутки, то wxWidgets для каждой системы свой, и благодаря этому все элементы отображаются максимально похожими на системный стиль.
Важная особенность wxWidgets заключается в использовании «родных» графических элементов интерфейса операционной системы везде, где это возможно. Это существенное преимущество для многих пользователей, поскольку они привыкают работать в конкретной среде, а изменения интерфейса программ часто вызывают затруднения в их работе.
В Сети есть урок по работе с библиотекой от её разработчиков.
SDL 2.0
SDL — кроссплатформенная 2D-библиотека, предназначенная для написания приложений (в основном игр). Поддерживаются Windows, Linux, Mac OS, а также Android, Windows Mobile и iOS. Преимущества библиотеки — быстрота, надёжность и лёгкость в эксплуатации. Также в библиотеке реализованы профессиональные инструменты для работы со звуком — это большой плюс при разработке крупных проектов.
Комбинируется с wxWidgets и хорошо интегрируется с OpenGL.
Существует целый цикл уроков, размещённый на Habr.
GTK+
Пожалуй, одна из самых известных графических библиотек. GTK+ — графический фреймворк, широко применяемый во многих системах. Изначально он задумывался как компонент GIMP, но за 20 лет после выпуска первой стабильной версии он нашёл применение в сотнях других приложений.
Сейчас GTK+ — это полноценный графический фреймворк, не уступающий тому же QT. Он поддерживает разные языки программирования и продолжает развиваться.
В своё время библиотека создавалась в качестве альтернативы Qt, которая была платной. GTK+ — один из немногих фреймворков, которые поддерживают язык C. Библиотека кроссплатформенная, но есть мнение, что программы на Linux выглядят более нативно, чем на Windows или Mac OS (GTK+ хорошо поддерживается даже на KDE). Интересно, что из-за некоторых проблем с кроссплатформенностью Wireshark перешла на Qt.
Пример первой программы можно посмотреть на Википедии.
Fast Light Toolkit
FLTK (произносится как «фуллтик») — графическая библиотека, которая работает на Windows, Linux (X11) и Mac OS. Поддерживает 3D графику с помощью OpenGL и имеет встроенный GLUT симулятор. Есть встроенный софт для создания интерфейсов — FLUID. Документация по библиотеке находится здесь.
Nana
Nana — это кроссплатформенная библиотека для программирования GUI в стиле современного C++. Поддерживаемые системы: Windows, Linux (X11) и Mac OS (экспериментально). Поддержка С++11\17 даёт возможность использовать современные фичи C++: лямбды, умные указатели и стандартную библиотеку. Так как это не фреймворк, использование Nana не будет оказывать влияния на архитектуру программы.
Здесь можно посмотреть документацию и примеры.
Заключение
Всегда следует учитывать особенности той или иной технологии. Выпишите список функций своего приложения, ещё раз прочитайте описания всех графических библиотек C++, и только после этого выбирайте то, что подойдёт вам больше всего.
Как открыть приложение в режиме Slide Over на iPad
Вы можете работать в приложении, открытом поверх другого приложения или поверх себя самого. Например, откройте приложение «Сообщения» в режиме Slide Over, чтобы продолжить разговор во время использования приложения «Карты».
iPad отслеживает приложения, открытые в режиме Slide Over, и Вы можете легко переключаться между ними.
Как открыть другое приложение в режиме Slide Over
Во время работы в основном приложении смахните вверх от нижнего края экрана и остановите палец, чтобы отобразить панель Dock.
Коснитесь приложения в панели Dock и, удерживая, перетяните его на экран над панелью Dock.
Если какое-либо приложение уже открыто в режиме Slide Over, оно будет заменено тем приложением, которое Вы перетягиваете из панели Dock.
Чтобы открыть третье приложение в режиме Slide Over, когда на экране открыты два приложения в режиме Split View (на поддерживаемых моделях), перетяните это приложение из панели Dock на разделитель приложений Split View. (См. Открытие двух объектов в режиме Split View на iPad).
Переключение между приложениями в режиме Slide Over
Смахните вправо вдоль нижней части окна Slide Over или выполните приведенные ниже действия.
Смахните вверх от нижнего края окна Slide Over.
Коснитесь приложения, чтобы к нему перейти.
Если приложение не отображается, смахивайте вправо, чтобы пролистать другие приложения.
Перемещение окна Slide Over
Выполните одно из описанных ниже действий:
Перемещение окна Slide Over на другую сторону экрана. Перетяните окно Slide Over, удерживая его за верхний край.
Удаление окна Slide Over. Перетяните окно, удерживая его за верхний край, за пределы правого края экрана.
Перемещение окна Slide Over обратно на экран. В любом открытом приложении смахните влево от правого края экрана.
Первое графическое приложение в Visual Basic.NET
Первое графическое приложение
Последнее обновление: 30.10.2015
В прошлой теме было рассмотрено создание первого консольного приложения на языке Visual Basic.NET. Теперь рассмотрим создание графических программ. Хотя в дальнейшем мы будем преимущество использовать консольные приложения, однако поскольку одной из сильных сторон VB изначально была работа с графикой, то также затронем и этот аспект.
Для создания графического приложения в Visual Studio в меню выберем пункт File (Файл) и в появившемся подменю пункт New Project (Создать проект). И в диалоговом окне создания нового проекта укажем в качестве типа проекта Windows Forms Application:
Проект графического приложения Windows Forms будет немного отличаться от консольного приложения. Здесь у нас уже в левой части по умолчанию открывается графический дизайнер с формой приложения:
Изменим форму, добавив к ней кнопку и текстовое поле. Для этого наведем указатель мыши на вкладку ToolBox (Панель инструментов) слева от формы и перетащим на форму с появившейся панели инструментов элементы Button и TextBox:
И форма у нас будет выглядеть в итоге примерно следующим образом:
Изменим некоторые свойства наших элементов управления. Во-первых, изменим заголовок окна. Нажмем на форму один раз в любом месте и перейдем к окну Properties (Свойства): в нем теперь будут отображаться все свойства формы. Найдем свойство Text и введем в поле вместо Form1 заголовок «Моя первая программа».
Подобным образом можно изменить и другие свойства формы, а также кнопки и текстового поля. Теперь добавим в наше приложение программную логику. Наше приложение по нажатию на кнопку будет выводить текст, который введен в текстовое поле. Два раза нажмите на кнопку, и перед вами откроется собственно код нашей формы в текстовом редакторе. По умолчанию после двойного нажатию на кнопку Visual Studio автоматически сгенерирует обработчик нажатия кнопки:
Вместо имеющегося кода введите следующий:
Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'Объявление переменной s, которой присваиваем весь текст в текстовом поле Dim s As String = TextBox1.Text If s = "" Then MessageBox.Show("Текст отсутствует") Else MessageBox.Show(s) End If End Sub End Class
Что весь этот код означает? Во-первых, обратите внимание на комментарий — знаком ‘. Помеченные таким знаком строки не выполняются и просто служат для разъяснения текста программы. Далее мы объявляем переменную s, которая имеет тип String, так как она буде у нас представлять строку. Эта переменная получает текст текстового поля. Текстовое поле у нас по умолчанию имеет имя TextBox1, а весь текст мы можем получить через его свойство Text. После этого мы смотрим, есть ли в переменной, а значит и в текстовом поле какой-нибудь текст, и если нет, то выводим сообщение «Текст отсутствует». Иначе выводим содержимое переменной s. Нажмем клавишу F5 и запустим приложение на выполнение. Теперь введем некоторый текст в текстовое поле и нажмем на кнопку. Нам отобразится сообщение с введенным текстом.
И теперь перейдем непосредственно к изучению синтаксиса языка VB.NET.
Как создать приложение с графическим интерфейсом пользователя Python с помощью wxPython — Real Python
Первым шагом при создании чего-то нового является определение того, что вы хотите создать. В данном случае я взял на себя смелость принять это решение за вас. Вы узнаете, как создать редактор тегов MP3! Следующий шаг при создании чего-то нового — выяснить, какие пакеты могут помочь вам в выполнении вашей задачи.
Если вы выполните поиск в Google для Python с тегами mp3
, вы обнаружите, что у вас есть несколько вариантов:
Я попробовал пару из них и решил, что eyeD3 имеет хороший API, который вы можете использовать, не увязая со спецификацией MP3 ID3.Вы можете установить eyeD3 , используя pip
, например:
При установке этого пакета на macOS вам может потребоваться установить libmagic
с использованием brew
. У пользователей Windows и Linux не должно возникнуть проблем с установкой eyeD3.
Проектирование пользовательского интерфейса
Когда дело доходит до разработки интерфейса, всегда приятно просто набросать набросок того, как, по вашему мнению, должен выглядеть пользовательский интерфейс.
Вам необходимо уметь делать следующее:
- Открыть один или несколько файлов MP3
- Показать текущие теги MP3
- Редактировать тег MP3
Большинство пользовательских интерфейсов используют меню или кнопку для открытия файлов или папок.Для этого вы можете использовать меню File . Поскольку вы, вероятно, захотите увидеть теги для нескольких файлов MP3, вам нужно будет найти виджет, который может сделать это в удобной форме.
Что-то табличное со столбцами и строками было бы идеально, потому что тогда вы можете иметь помеченные столбцы для тегов MP3. В наборе инструментов wxPython есть несколько виджетов, которые подойдут для этого, из которых два верхних — следующие:
В этом случае вам следует использовать wx.ListCtrl
, поскольку виджет Grid
является излишним, и, честно говоря, он также немного сложнее.Наконец, вам понадобится кнопка для редактирования выбранного тега MP3.
Теперь, когда вы знаете, что хотите, можете оформить:
Иллюстрация выше дает нам представление о том, как должно выглядеть приложение. Теперь, когда вы знаете, что хотите сделать, пора писать код!
Создание пользовательского интерфейса
Есть много разных подходов к написанию нового приложения. Например, нужно ли вам следовать шаблону проектирования модель-представление-контроллер? Как разделить классы? Один класс на файл? Таких вопросов много, и по мере того, как вы набираетесь опыта в дизайне графического интерфейса, вы будете знать, как вы хотите на них ответить.
В вашем случае вам действительно нужны только два класса:
- A
ш.панель
класс - A
wx. Рама
класс
Вы могли бы возразить и в пользу создания модуля типа контроллера, но для чего-то вроде этого он вам действительно не нужен. Также может быть рассмотрен вариант помещения каждого класса в отдельный модуль, но чтобы он оставался компактным, вы создадите один файл Python для всего вашего кода.
Начнем с импорта и класса панели:
импортные 3
импортный глобус
импорт wx
класс Mp3Panel (wx.Панель):
def __init __ (я, родитель):
super () .__ init __ (родитель)
main_sizer = wx.BoxSizer (wx.VERTICAL)
self.row_obj_dict = {}
self. list_ctrl = wx.ListCtrl (
self, size = (- 1, 100),
style = wx.LC_REPORT | wx.BORDER_SUNKEN
)
self.list_ctrl.InsertColumn (0, 'Художник', ширина = 140)
self.list_ctrl.InsertColumn (1, 'Альбом', ширина = 140)
self.list_ctrl.InsertColumn (2, 'Заголовок', ширина = 200)
main_sizer.Add (self.list_ctrl, 0, wx.ВСЕ | wx.EXPAND, 5)
edit_button = wx.Button (self, label = 'Изменить')
edit_button.Bind (wx.EVT_BUTTON, self.on_edit)
main_sizer.Add (edit_button, 0, wx.ALL | wx.CENTER, 5)
self.SetSizer (main_sizer)
def on_edit (себя, событие):
print ('в on_edit')
def update_mp3_listing (self, folder_path):
печать (путь_папки)
Здесь вы импортируете пакет eyed3
, пакет Python glob
и пакет wx
для своего пользовательского интерфейса.Затем вы создаете подкласс wx.Panel
и создаете свой пользовательский интерфейс. Вам нужен словарь для хранения данных о ваших MP3-файлах, который вы можете назвать row_obj_dict
.
Затем вы создаете wx.ListCtrl
и устанавливаете его в режим отчета ( wx.LC_REPORT
) с утопленной рамкой ( wx.BORDER_SUNKEN
). Элемент управления списком может принимать несколько других форм в зависимости от флага стиля, который вы передаете, но флаг отчета является наиболее популярным.
Чтобы у ListCtrl
были правильные заголовки, вам нужно будет позвонить по номеру .InsertColumn ()
для каждого заголовка столбца. Затем вы указываете индекс столбца, его метку и ширину столбца в пикселях.
Последний шаг — добавить кнопку Edit
, обработчик событий и метод. Вы можете создать привязку к событию и пока оставить метод, который он вызывает, пустым.
Теперь нужно написать код для фрейма:
класс Mp3Frame (wx.Frame):
def __init __ (сам):
super () . __ init __ (parent = None,
title = 'Редактор тегов Mp3')
себя.панель = Mp3Panel (самостоятельно)
self.Show ()
если __name__ == '__main__':
app = wx.App (Ложь)
frame = Mp3Frame ()
app.MainLoop ()
Этот класс намного проще первого в том, что все, что вам нужно сделать, это установить заголовок фрейма и создать экземпляр класса панели, Mp3Panel
. Когда вы закончите, ваш пользовательский интерфейс должен выглядеть так:
Пользовательский интерфейс выглядит почти правильно, но у вас нет меню Файл . Это делает невозможным добавление файлов MP3 в приложение и редактирование их тегов!
Давайте исправим это сейчас.
Создание работающего приложения
Первый шаг к тому, чтобы ваше приложение работало, — это обновить приложение, чтобы оно имело меню File , потому что тогда вы можете добавлять файлы MP3 в свое творение. Меню почти всегда добавляются к классу wx.Frame
, поэтому вам нужно изменить этот класс.
Примечание: Некоторые приложения отказались от меню в своих приложениях. Одним из первых, кто сделал это, был Microsoft Office, когда они добавили панель ленты.В наборе инструментов wxPython есть настраиваемый виджет, который можно использовать для создания лент в wx.lib.agw.ribbon
.
Другой тип приложений, в которых в последнее время отсутствуют меню, — это веб-браузеры, такие как Google Chrome и Mozilla Firefox. Сейчас они просто используют панели инструментов.
Давайте узнаем, как добавить строку меню в наше приложение:
класс Mp3Frame (wx.Frame):
def __init __ (сам):
wx.Frame .__ init __ (self, parent = None,
title = 'Редактор тегов Mp3')
себя.панель = Mp3Panel (самостоятельно)
self.create_menu ()
self.Show ()
def create_menu (сам):
menu_bar = wx.MenuBar ()
file_menu = wx. Menu ()
open_folder_menu_item = file_menu.Append (
wx.ID_ANY, "Открыть папку",
"Открыть папку с MP3"
)
menu_bar.Append (file_menu, '& Файл')
self.Bind (
event = wx.EVT_MENU,
handler = self.on_open_folder,
source = open_folder_menu_item,
)
себя.SetMenuBar (панель_меню)
def on_open_folder (я, событие):
title = "Выберите каталог:"
dlg = wx.DirDialog (self, title,
style = wx.DD_DEFAULT_STYLE)
если dlg.ShowModal () == wx.ID_OK:
self.panel.update_mp3_listing (dlg.GetPath ())
dlg.Destroy ()
Здесь вы добавляете вызов .create_menu ()
внутри конструктора класса. Затем в самом .create_menu ()
вы создадите экземпляр wx.MenuBar
и wx.Экземпляр меню
.
Чтобы добавить пункт меню в меню, вы вызываете .Append ()
экземпляра меню и передаете ему следующее:
- Уникальный идентификатор
- Ярлык для нового пункта меню
- Строка справки
Затем вам нужно добавить меню в строку меню, поэтому вам нужно будет вызвать строку меню .Append ()
. Требуется экземпляр меню и метка для меню. Этот ярлык немного странный, потому что вы назвали его & File
вместо File
.Амперсанд сообщает wxPython создать сочетание клавиш Alt + F , чтобы открыть меню File
, используя только вашу клавиатуру.
Примечание: Если вы хотите добавить сочетания клавиш в свое приложение, вам нужно будет использовать экземпляр wx.AcceleratorTable
для их создания. Вы можете узнать больше о таблицах Accerator в документации wxPython.
Чтобы создать привязку события, вам нужно вызвать self.Bind ()
, который привязывает фрейм к wx.EVT_MENU
. Когда вы используете self. Bind ()
для события меню, вам нужно не только указать wxPython, какой обработчик
использовать, но также и к какому источнику
привязать обработчик.
Наконец, вы должны вызвать фрейм .SetMenuBar ()
и передать ему экземпляр строки меню, чтобы он был показан пользователю.
Теперь, когда у вас есть меню, добавленное к вашему фрейму, давайте рассмотрим обработчик событий элемента меню, который снова воспроизводится ниже:
def on_open_folder (self, event):
title = "Выберите каталог:"
dlg = wx.DirDialog (я, заголовок, стиль = wx.DD_DEFAULT_STYLE)
если dlg.ShowModal () == wx.ID_OK:
self.panel.update_mp3_listing (dlg.GetPath ())
dlg.Destroy ()
Поскольку вы хотите, чтобы пользователь выбирал папку, содержащую файлы MP3, вам следует использовать wx.DirDialog из wxPython .
wx.DirDialog
позволяет пользователю открывать только каталоги.
Вы можете установить заголовок диалога и различные флаги стиля. Чтобы открыть диалоговое окно, вам нужно будет вызвать .ShowModal ()
.Это приведет к тому, что диалоговое окно будет отображаться модально, что означает, что пользователь не сможет взаимодействовать с вашим основным приложением, пока отображается диалоговое окно.
Если пользователь нажимает кнопку OK диалогового окна, вы можете получить выбор пути пользователя с помощью диалогового окна .GetPath ()
. Вы захотите передать этот путь своему классу панели, что вы можете сделать здесь, вызвав .update_mp3_listing ()
панели.
Наконец, вам нужно закрыть диалог. Чтобы закрыть диалоговое окно, рекомендуется вызвать его .Уничтожить ()
.
имеют метод .Close ()
, но он в основном просто скрывает диалог, и он не уничтожает себя при закрытии приложения, что может привести к странным проблемам, таким как ваше приложение теперь закрывается должным образом. Проще вызвать .Destroy ()
в диалоговом окне, чтобы предотвратить эту проблему.
Теперь давайте обновим ваш класс Mp3Panel
. Вы можете начать с обновления .update_mp3_listing ()
:
def update_mp3_listing (self, folder_path):
себя.current_folder_path = путь_папки
self.list_ctrl.ClearAll ()
self.list_ctrl.InsertColumn (0, 'Художник', ширина = 140)
self.list_ctrl.InsertColumn (1, 'Альбом', ширина = 140)
self.list_ctrl.InsertColumn (2, 'Заголовок', ширина = 200)
self.list_ctrl.InsertColumn (3, 'Год', ширина = 200)
mp3s = glob.glob (путь_папки + '/*.mp3')
mp3_objects = []
индекс = 0
для mp3 в mp3:
mp3_object = eyed3.load (mp3)
self.list_ctrl.InsertItem (индекс,
mp3_object.tag.artist)
себя.list_ctrl.SetItem (индекс, 1,
mp3_object.tag.album)
self.list_ctrl.SetItem (индекс, 2,
mp3_object.tag.title)
mp3_objects.append (mp3_object)
self.row_obj_dict [индекс] = mp3_object
индекс + = 1
Здесь вы устанавливаете текущий каталог в указанную папку, а затем очищаете элемент управления списком. Это сохраняет контроль списка свежим и показывает только те MP3-файлы, над которыми вы в настоящее время работаете. Это также означает, что вам нужно снова вставить все столбцы.
Затем вам нужно взять переданную папку и использовать модуль Python glob
для поиска файлов MP3.
Затем вы можете перебрать MP3-файлы и превратить их в объекты eyed3
. Вы можете сделать это, позвонив по номеру .load ()
из eyed3
. Предполагая, что у MP3-файлов уже есть соответствующие теги, вы можете добавить исполнителя, альбом и название MP3 в элемент управления списком.
Интересно, что метод добавления новой строки в объект управления списком - это вызов .InsertItem ()
для первого столбца и SetItem ()
для всех последующих столбцов.
Последний шаг - сохранить объект MP3 в словаре Python, row_obj_dict
.
Теперь вам нужно обновить обработчик событий .on_edit ()
, чтобы вы могли редактировать теги MP3:
def on_edit (self, event):
selection = self.list_ctrl.GetFocusedItem ()
если выбор> = 0:
mp3 = self.row_obj_dict [выбор]
dlg = EditDialog (mp3)
dlg.ShowModal ()
self.update_mp3_listing (self.current_folder_path)
dlg.Destroy ()
Первое, что вам нужно сделать, это получить выбор пользователя, вызвав элемент управления списком .GetFocusedItem ()
.
Если пользователь ничего не выбрал в элементе управления списком, он вернет -1
. Предполагая, что пользователь что-то выбрал, вы захотите извлечь объект MP3 из своего словаря и открыть диалоговое окно редактора тегов MP3. Это будет настраиваемый диалог, который вы будете использовать для редактирования тегов исполнителя, альбома и заголовка файла MP3.
Как обычно, показывать диалог модально. Когда диалог закроется, будут выполнены две последние строки в .on_edit ()
. Эти две строки обновят элемент управления списком, чтобы отобразить текущую информацию тега MP3, которую пользователь только что отредактировал, и уничтожить диалоговое окно.
Создание диалогового окна редактирования
Последний кусок головоломки - создание диалогового окна редактирования тегов MP3. Для краткости мы не будем рисовать этот интерфейс, так как он представляет собой серию строк, содержащих метки и текстовые элементы управления.В текстовых элементах управления должна быть предварительно заполнена информация о существующих тегах. Вы можете создать метку для текстовых элементов управления, создав экземпляры wx.StaticText
.
Когда вам нужно создать собственный диалог, класс wx.Dialog
- ваш друг. Вы можете использовать это для создания редактора:
класс EditDialog (wx. Dialog):
def __init __ (self, mp3):
title = f'Editing "{mp3.tag.title}" '
super () .__ init __ (родительский = Нет, заголовок = заголовок)
себя.mp3 = mp3
self.main_sizer = wx.BoxSizer (wx.VERTICAL)
self.artist = wx.TextCtrl (
self, value = self.mp3.tag.artist)
self.add_widgets ('Художник', self.artist)
self.album = wx.TextCtrl (
self, value = self.mp3.tag.album)
self.add_widgets ('Альбом', self.album)
self.title = wx.TextCtrl (
self, value = self.mp3.tag.title)
self.add_widgets ('Заголовок', self.title)
btn_sizer = wx.BoxSizer ()
save_btn = wx.Кнопка (self, label = 'Сохранить')
save_btn.Bind (wx.EVT_BUTTON, self.on_save)
btn_sizer.Add (save_btn, 0, wx.ALL, 5)
btn_sizer.Add (wx.Button (
self, id = wx.ID_CANCEL), 0, wx.ALL, 5)
self.main_sizer.Add (btn_sizer, 0, wx.CENTER)
self.SetSizer (self.main_sizer)
Здесь вы хотите начать с подкласса wx.Dialog
и присвоения ему настраиваемого заголовка на основе заголовка MP3, который вы редактируете.
Затем вы можете создать размер, который хотите использовать, и виджеты.Чтобы упростить задачу, вы можете создать вспомогательный метод с именем .add_widgets ()
для добавления виджетов wx.StaticText
в виде строк с экземплярами текстовых элементов управления. Единственным другим виджетом здесь является кнопка Сохранить .
Давайте напишем метод add_widgets
следующим образом:
def add_widgets (self, label_text, text_ctrl):
row_sizer = wx.BoxSizer (wx.ГОРИЗОНТАЛЬНО)
label = wx.StaticText (self, label = label_text,
размер = (50, -1))
row_sizer.Добавить (метка, 0, wx.ALL, 5)
row_sizer.Add (text_ctrl, 1, wx.ALL | wx.EXPAND, 5)
self.main_sizer.Add (row_sizer, 0, wx. EXPAND)
add_widgets ()
принимает текст метки и экземпляр элемента управления текстом. Затем он создает горизонтально ориентированный BoxSizer
.
Затем вы создадите экземпляр wx.StaticText
, используя переданный текст для его параметра метки. Вы также установите его размер равным 50
пикселей в ширину, а высоту по умолчанию - –1
.Поскольку вам нужна метка перед текстовым элементом управления, вы сначала добавите виджет StaticText в свой BoxSizer, а затем добавите текстовый элемент управления.
Наконец, вы хотите добавить горизонтальный измеритель размера к вертикальному измерителю верхнего уровня. Вложив размеры друг в друга, вы можете разрабатывать сложные приложения.
Теперь вам нужно создать обработчик событий on_save ()
, чтобы вы могли сохранить свои изменения:
def on_save (себя, событие):
self.mp3.tag.artist = self.artist.GetValue ()
self.mp3.tag.album = self.album.GetValue ()
self.mp3.tag.title = self.title.GetValue ()
self.mp3.tag.save ()
self.Close ()
Здесь вы устанавливаете теги для содержимого текстовых элементов управления, а затем вызываете .save ()
объекта eyed3
. Наконец, вы вызываете .Close ()
диалогового окна. Причина, по которой вы звоните. Close ()
здесь вместо .Destroy ()
- это то, что вы уже вызываете .Destroy ()
в .on_edit ()
вашего подкласса панели.
Теперь ваша заявка готова!
Vernier Graphical Analysis ™ - Vernier
Технические характеристики
Windows
Компьютер под управлением Windows 10. Только компьютеры с Windows 10 с совместимыми радиомодулями Bluetooth ® будут поддерживать соединения Bluetooth.
macOS
Компьютер под управлением macOS 10.11, 10.12, 10.13, 10.14 или 10.15. USB и Bluetooth.
Chromebook
Chromebook под управлением ChromeOS 70 или новее.USB и Bluetooth.
Устройства iOS
iOS 11 или новее
- iPad ® (4-го поколения или новее), iPad mini ™ (2-го поколения или новее), iPad Air ® и iPad Pro
- iPhone ® (5S или новее)
- iPod touch ® (5-го поколения или новее)
См. Информацию о приложениях для более старых операционных систем iOS
Устройства Android
Для графического анализас поддержкой Go Direct требуется Android 6.0.1 или новее.
Получить версию Pro
Сделайте виртуальную науку реальной с помощью обновления до Vernier Graphical Analysis ™ ProНаша недавно улучшенная версия графического анализа позволяет учащимся экспериментировать и анализировать данные в реальном времени - дома или в классе. В версии Pro вы можете создавать свои собственные живые эксперименты с использованием датчиков Vernier и обмениваться данными со студентами в режиме реального времени. Посмотрите наш обзор, чтобы увидеть совместное использование данных в действии.
Зачем переходить на Graphical Analysis Pro?
- Повысьте понимание сложных научных концепций с помощью обмена данными - наблюдение за данными, собранными прямо на глазах у студентов, помогает им соединять абстрактные концепции с реальными приложениями.
- Обновление до Graphical Analysis Pro открывает доступ к десяткам примеров экспериментов с видео, синхронизированными данными и пошаговыми инструкциями, охватывающими общие темы из биологии, химии и физики. Это предоставляет учащимся готовый к использованию богатый контент для изучения и анализа.
- Версия Pro приложения включает в себя все функции графического анализа, а также расширенные функции, такие как настраиваемая кривая для более глубокого анализа данных экспериментов.
- Доступна бесплатная 30-дневная пробная версия и цены на лицензию для сайта.
Попробуйте Graphical Analysis Pro бесплатно!
Как создать приложение с графическим интерфейсом пользователя с помощью Python
Эта статья была первоначально опубликована в мае 2016 года и была дополнена новой информацией.
В путешествии большинства программистов наступает момент, когда они готовы перейти от основных примеров и начать создавать графический интерфейс для своей программы.
В Python шаги для начала программирования с графическим интерфейсом пользователя не слишком сложны, но они требуют, чтобы пользователь начал делать какой-то выбор. По своей природе как язык программирования общего назначения с интерпретаторами, доступными во всех распространенных операционных системах, Python должен быть достаточно агностическим в отношении вариантов, которые он предоставляет для создания графических пользовательских интерфейсов.
К счастью, существует множество возможностей для программистов, которые хотят создать простой способ взаимодействия пользователей со своими программами.Привязки существуют для нескольких фреймворков пользовательского интерфейса на различных платформах, в том числе для Linux, Windows и Mac, и многие из них работают на всех трех.
Прежде чем идти дальше, станьте на мгновение своим собственным защитником дьявола и спросите: действительно ли имеет смысл для вашего приложения вообще иметь традиционный графический пользовательский интерфейс? Для некоторых программ ответ очевиден. Если ваше приложение изначально является графическим и либо оптимизировано, либо имеет смысл запускаться локально на одном локальном компьютере, то да, вам, вероятно, следует подумать о создании графического интерфейса для рабочего стола.Часто это становится очевидным из того, что вы разрабатываете.
Но для программ общего назначения не считайте ни командную строку, ни веб-интерфейс. Командная строка предлагает множество преимуществ - скорость, удаленный доступ, возможность повторного использования, возможность создания сценариев и контроль, - которые могут быть более важны для пользователей вашего приложения, чем графический интерфейс, и существует множество библиотек, таких как Click, Cement и Cliff, которые упрощают создавать отличные программы из командной строки.
Точно так же веб-интерфейс, даже для программы, предназначенной для локального запуска, может быть вариантом, который стоит рассмотреть, особенно если вы считаете, что ваши пользователи могут захотеть разместить ваше приложение удаленно, а такие проекты, как Django, Flask или Pyramid, делают это простой.Вы даже можете использовать такую библиотеку, как pywebview, чтобы обернуть тонкую оболочку вокруг веб-приложения в собственном окне графического интерфейса.
В качестве альтернативы вы можете использовать фреймворк, такой как Pyforms, для создания единообразного взаимодействия в Интернете, командной строке и на рабочем столе, все с единой базой кода.
Все еще уверены, что хотите создать графический интерфейс? Отлично, вот несколько фантастических библиотек с открытым исходным кодом, с которых можно начать.
PyQt, PySide и Qt для Python
PyQt реализует популярную библиотеку Qt, поэтому, если вы знакомы с разработкой Qt на другом языке, возможно, по разработке собственных приложений для KDE или другой среды рабочего стола на основе Qt, вы, возможно, уже знакомы с Qt.Это открывает возможность разработки приложений на Python, которые имеют знакомый внешний вид на многих платформах, с одновременным использованием инструментов и знаний большого сообщества Qt.
Qt хорошо зарекомендовал себя в сообществе разработчиков и имеет инструменты, отражающие это. Написание приложений Python на основе Qt означает, что у вас есть доступ к QtCreator, который имеет режим конструктора для генерации кода для макета вашего приложения.
PyQt имеет двойную лицензию как по коммерческой, так и по GPL лицензии, в отличие от самого проекта Qt, и основная компания, поддерживающая PyQt, предлагает часто задаваемые вопросы о лицензии, чтобы помочь понять, что это означает для вашего приложения.
В качестве другого варианта использования библиотек Qt с Python рассмотрите Qt для Python (обычно известный как PySide2), доступный в рамках LPGL.
Ткинтер
Если бы существовал единственный пакет, который можно было бы назвать «стандартным» набором инструментов графического интерфейса для Python, то это был бы Tkinter. Tkinter - это оболочка для Tcl / Tk, популярного графического интерфейса и языковой пары, впервые получившего популярность в начале 90-х годов. Преимущество выбора Tkinter - это огромное количество ресурсов, включая книги и образцы кода, а также большое сообщество пользователей, которые могут помочь вам, если у вас возникнут вопросы.С простых примеров легко начать работу, и они довольно удобочитаемы.
Tkinter доступен под лицензией Python поверх лицензии BSD Tcl / Tk.
WxPython
WxPython переносит кроссплатформенную библиотеку графического интерфейса wxWidgets из собственного C ++ в Python. WxPython выглядит немного более естественным, чем Tkinter, в разных операционных системах, потому что он использует виджеты хост-системы для создания графического интерфейса. Начать работу с ним довольно просто, и сообщество разработчиков постоянно растет.Вам может потребоваться связать wxPython с вашими приложениями или потребовать, чтобы пользователь установил его самостоятельно, поскольку он не устанавливается автоматически вместе с Python.
WxPython использует лицензию библиотеки wxWindows для своего родительского проекта, одобренного OSI.
Python GTK + 3
Ранее известный как PyGTK, проект Python GTK + 3 обеспечивает привязки Python к объектам GTK (окнам, виджетам и т. Д.). GTK + наиболее широко используется в качестве основы для рабочего стола GNOME, но он доступен для автономных приложений в Linux, Windows и Mac.В Python GTK + 3 такая же структура доступна для ваших проектов Python.
Когда вы используете Python GTK + 3, вы можете использовать многие из тех же инструментов разработки, которые созданы для самого GTK +. В частности, сюда входит Glade, дизайнер интерфейсов для приложений GTK +. Интерфейсы, разработанные в Glade, сохраняются как XML и используются объектом GtkBuilder в коде вашего приложения, но интерфейс, который вы используете, является перетаскиваемым, что упрощает создание динамического и отзывчивого пользовательского интерфейса без необходимости переводить то, что вы видите в своем коде. разум в код макета.
Киви
Созданный с учетом быстрой разработки и современных устройств, Kivy представляет собой набор инструментов для Linux (включая Raspberry Pi), Windows, Mac и Android. Проект ориентирован на «инновационные пользовательские интерфейсы» и используется для мультимедийных приложений, таких как приложения для музыкальных контроллеров для телефонов и приложения для интерактивной доски, занимающие всю стену конференц-зала.
Kivy не имеет программы визуального макета, такой как QtCreator и Glade, но он использует свой собственный язык дизайна, чтобы помочь вам связать макет пользовательского интерфейса с объектами кода.Это позволяет вам легко разделить (как мысленно, так и в коде макета) классы и функции в вашем приложении. В Kivy также есть Kivy Garden, хранилище пользовательских виджетов и надстроек, поэтому, если вы думаете о создании чего-то, чего не предоставляет сама Kivy, возможно, это уже существует в Garden.
Это не единственный выбор, который у вас есть, даже далеко. Чтобы узнать о дополнительных возможностях, посетите страницу «Программирование с графическим интерфейсом на Python» в официальной вики-странице Python Software Foundation, где перечислены десятки других инструментов.Доступны решения для привязки Python ко многим различным библиотекам виджетов и инструментам графического интерфейса, таким как FLTK, FOX и многим другим. Хотя новичкам, вероятно, следует избегать проектов, предоставляющих только частичную реализацию или тех, которые больше не поддерживаются активно, существует множество хороших инструментов для различных ситуаций.
Многие из вариантов существуют для традиционных приложений, которые принимают оконный вид и поведение их родительской среды рабочего стола, но также бывают случаи, когда вы можете захотеть сделать что-то совершенно другое, например, в видеоигре.Есть отличные библиотеки для этих ситуаций, такие как pygame, pyglet и Panda3d.
У вас есть фаворит, не упомянутый здесь? Дайте нам знать в комментариях ниже!
Вы хотите прочитать больше подобных статей? Подпишитесь на нашу еженедельную рассылку новостей по электронной почте.
Написание графического приложения для научного программирования с использованием TraitsUI 7.1 - TraitsUI 7 User Manual
Что такое резьбы?
Стандартная программа на Python выполняется последовательно.Рассмотрим следующий фрагмент кода:
do_b () не вызывается до завершения do_a () . Даже в циклах событий все последовательно. В некоторых ситуациях это может быть очень ограничивающим. Предположим, мы хотим сделать снимок с камеры, и это очень длительная операция. Предположим также, что никакая другая операция в нашей программе требует, чтобы захват был полным. Хотелось бы иметь другой «Временная шкала», на которой инструкции по захвату камеры могут происходить в последовательный способ, в то время как остальная часть программы продолжается параллельно.
Потоки - это решение этой проблемы: поток - это часть программа, которая может работать одновременно с другими частями программы.
Программирование с потоками затруднено, так как инструкции больше не выполняются в том порядке, в котором они указаны, и вывод программы может варьироваться от прогона к другому, в зависимости от тонких проблем с синхронизацией. Эти проблемы известны как «состояния гонки», и чтобы их минимизировать, вы должны избегайте доступа к одним и тем же объектам в разных потоках.Действительно, если два разные потоки изменяют один и тот же объект одновременно, могут случиться неожиданные вещи.
Потоки в Python
В python поток может быть реализован с помощью объекта Thread из модуль потоковой передачи. Чтобы создать свой собственный поток выполнения, создайте подкласс Thread и поместите код, который вы хотите запустить, в отдельный thread в его методе run . Вы можете начать свой поток, используя его start метод:
# thread_example.ру from threading import Thread от времени импортный сон класс MyThread (поток): def run (self): сон (2) print ("MyThread готов") my_thread = MyThread () my_thread.start () print («Основная цепочка завершена»)
Приведенный выше код дает следующий результат:
Основной поток завершен MyThread выполнено
Получение потоков и цикла событий графического интерфейса для хорошей игры
Предположим, у вас есть длительное задание в приложении TraitsUI. если ты реализовать это задание как событие, помещенное в стек цикла событий, это собирается заморозить цикл событий во время работы и, таким образом, заморозить пользовательский интерфейс, поскольку события будут накапливаться в стеке, но не будут обрабатываться, пока длительное задание не выполняется (помните, что цикл событий последовательный).Чтобы пользовательский интерфейс оставался отзывчивым, естественным ответом является поток.
Скорее всего, вы захотите отобразить результаты своей длительной работы. в графическом интерфейсе. Однако, как обычно с потоками, нужно быть осторожным, чтобы запускать условия гонки. Наивно манипулируя объектами графического интерфейса в вашем поток приведет к условиям гонки и непредсказуемому сбою: предположим, что GUI перерисовывался (например, из-за перемещения окна), когда вы изменить его.
В приложении, если вы запустите поток, событие GUI все равно будет обрабатывается циклом событий графического интерфейса пользователя.Чтобы избежать столкновений между вашей цепочкой и цикл событий, правильный способ изменения объекта GUI - вставить модификации в цикле событий с использованием вызова GUI.invoke_later () . Таким образом, графический интерфейс применит ваши инструкции, когда будет время.
Последние версии модуля TraitsUI (после октября 2006 г.) распространяют изменения, которые вы вносите в объект HasTraits в его представление в потокобезопасный способ. Однако важно иметь в виду, что изменение объект с графическим представлением может вызвать срабатывание условия гонки, поскольку они могут быть изменены с помощью графического инструментария, в то время как вы получаете к нему доступ.Вот пример кода, вставляющего модификация объектов свойств вручную в цикле событий:
# traits_thread.py from threading import Thread от времени импортный сон from traits.api import Button, HasTraits, Instance, Str из traitsui.api импортировать View, Item класс TextDisplay (HasTraits): строка = Str () view = View (Item ('строка', show_label = False, springy = True,)) класс CaptureThread (поток): def run (self): self.display.string = 'Камера запустилась \ n' + self.display.string n_img = 0 пока не self.wants_abort: сон (.5) n_img + = 1 self.display.string = ('% d изображение захвачено \ n'% n_img + self.display.string) self.display.string = 'Камера остановлена \ n' + self.display.string класс Camera (HasTraits): start_stop_capture = Кнопка () display = Экземпляр (TextDisplay) capture_thread = экземпляр (CaptureThread) view = View (Item ('start_stop_capture', show_label = False)) def _start_stop_capture_fired (самостоятельно): если сам.capture_thread и self.capture_thread.isAlive (): self.capture_thread.wants_abort = Верно еще: self.capture_thread = CaptureThread () self.capture_thread.wants_abort = Ложь self.capture_thread.display = self.display self.capture_thread.start () класс MainWindow (HasTraits): display = Экземпляр (TextDisplay, ()) camera = Экземпляр (Камера) def _camera_default (сам): вернуть камеру (display = self.display) view = View ('display', 'camera' ,, resizable = True) если __name__ == '__main__': MainWindow ().configure_traits ()
Это создает приложение с кнопкой, которая запускает или останавливает непрерывный цикл захвата камеры.
При нажатии кнопки «Начать остановку захвата» Вызывается метод _start_stop_capture_fired . Он проверяет, есть ли CaptureThread работает или нет. Если ни один не запущен, запускается новый один. Если один из них запущен, он устанавливает для своего атрибута want_abort значение true.
Поток проверяет каждые полсекунды, чтобы убедиться, что его атрибут Для want_abort установлено значение true.Если это так, он прерывается. Этот это простой способ завершить поток через событие графического интерфейса.
Использование разных потоков позволяет операциям избежать блокировки пользователя интерфейс, а также реагировать на другие события. в реальное приложение, которое служит основой этого руководства, там это 2 потока и цикл событий графического интерфейса.
Первый поток - это цикл сбора данных, во время которого цикл программы, ожидая, пока изображение будет снято на камеру ( камера управляется внешними сигналами).Как только изображение будет захвачено и передается в компьютер, поток получения сохраняет его на диск и порождает поток для обработки данных, а затем возвращается к ожиданию нового data, пока поток обработки обрабатывает данные. После обработки поток завершен, он отображает свои результаты (вставляя события отображения в цикле событий графического интерфейса пользователя) и умирает. Поток получения отказывается создавать новый поток обработки, если он еще работает. Это гарантирует эти данные никогда не теряются, независимо от того, как долго может длиться обработка.
Таким образом, одновременно выполняется до трех наборов инструкций: графический интерфейс цикл событий, реагирование на события, создаваемые пользователем, цикл сбора данных, реагирование на события, генерируемые оборудованием, и задания по обработке, выполнение числовая интенсивная работа.
В следующем разделе мы увидим, как добавить самодельный элемент в traits, чтобы добавить новые возможности в наше приложение.
Что такое GUI (графический интерфейс пользователя)?
Обновлено: 16.11.2019, компания Computer Hope
A GUI (графический интерфейс пользователя) - это система интерактивных визуальных компонентов для компьютерного программного обеспечения.Графический интерфейс пользователя отображает объекты, которые передают информацию и представляют действия, которые могут быть предприняты пользователем. Объекты меняют цвет, размер или видимость, когда пользователь взаимодействует с ними.
Объекты GUI включают значки, курсоры и кнопки. Эти графические элементы иногда дополняются звуками или визуальными эффектами, такими как прозрачность и тени.
Графический интерфейс пользователя считается более удобным для пользователя, чем текстовый интерфейс командной строки, такой как MS-DOS, или оболочка Unix-подобных операционных систем.
Графический интерфейс был впервые разработан в Xerox PARC Аланом Кей, Дугласом Энгельбартом и группой других исследователей в 1981 году. Позже Apple представила компьютер Lisa с графическим интерфейсом 19 января 1983 года.
Обзор графического интерфейса
Ниже приведено изображение рабочего стола Windows 7 и пример графического интерфейса пользователя.
СоветЕсли вам нужен пример командной строки для сравнения, см. Нашу страницу командной строки.
Как вы произносите GUI?
GUI произносится путем произнесения каждой буквы ( G-U-I ).Иногда также произносится как « липкий ».
Как работает графический интерфейс?
Графический интерфейс пользователя использует окна, значки и меню для выполнения команд, таких как открытие, удаление и перемещение файлов. Хотя операционная система с графическим интерфейсом пользователя в основном управляется с помощью мыши, клавиатуру также можно использовать с помощью сочетаний клавиш или клавиш со стрелками.
В качестве примера, если вы хотите открыть программу в системе с графическим интерфейсом пользователя, вы должны переместить указатель мыши на значок программы и дважды щелкнуть по нему.
Каковы преимущества графического интерфейса пользователя?
В отличие от операционной системы командной строки или CUI, таких как Unix или MS-DOS, операционные системы с графическим пользовательским интерфейсом легче изучать и использовать, поскольку команды не нужно запоминать. Кроме того, пользователям не нужно знать какие-либо языки программирования. Благодаря простоте использования и более современному внешнему виду операционные системы с графическим пользовательским интерфейсом заняли доминирующее положение на сегодняшнем рынке.
Каковы примеры операционной системы с графическим пользовательским интерфейсом?
Все ли операционные системы имеют графический интерфейс?
№Ранние операционные системы командной строки, такие как MS-DOS и даже некоторые версии Linux сегодня, не имеют графического интерфейса пользователя.
Каковы примеры графического интерфейса пользователя?
- GNOME
- KDE
- Любая программа Microsoft, включая Word, Excel и Outlook.
- Интернет-браузеры, такие как Internet Explorer, Chrome и Firefox.
Как пользователь взаимодействует с графическим интерфейсом пользователя?
Указывающее устройство, такое как мышь, используется для взаимодействия почти со всеми аспектами графического интерфейса пользователя.Более современные (и мобильные) устройства также используют сенсорный экран. Однако, как указывалось в предыдущих разделах, также можно перемещаться по графическому интерфейсу с помощью клавиатуры.
Требуется ли для графического интерфейса мышь?
Нет. Почти все графические интерфейсы пользователя, включая Microsoft Windows, имеют опции для навигации по интерфейсу только с помощью клавиатуры.
Aero, Компьютерные сокращения, Интерфейс, Microsoft Windows, MS-DOS, Операционная система, Термины операционной системы, Пользовательский интерфейс, WIMP
Графическое приложение- обзор
21.2 Модель памяти Evolution
Большие виртуальные и физические адресные пространства. Графические процессоры традиционно использовали только физическое адресное пространство с до 32 битов адреса, что ограничивало DRAM графического процессора до 4 гигабайт или меньше. Это связано с тем, что графические приложения не требовали более нескольких сотен мегабайт фрейм-буфера и текстурной памяти. Это контрастирует с 64-битным виртуальным пространством и более чем 40 битами физического пространства, которые программисты ЦП считали само собой разумеющимся в течение многих лет.Однако более современные графические приложения требовали большего.
Более поздние семейства графических процессоров, такие как Fermi и Kepler, приняли архитектуру виртуальной памяти в стиле ЦП с 64-битным виртуальным адресным пространством и физическим адресным пространством не менее 40 бит. Очевидным преимуществом является то, что графические процессоры Fermi и Kepler могут включать в себя более 4 гигабайт DRAM и что ядра CUDA теперь могут работать с очень большими наборами данных, независимо от того, размещены ли они полностью во встроенном графическом процессоре DRAM или путем доступа к отображаемой памяти хоста.
Архитектура виртуальной памяти Fermi также закладывает основу для потенциально глубокого усовершенствования модели программирования. Системную физическую память ЦП и физическую память ГП теперь можно отобразить в одном общем виртуальном адресном пространстве [GNS 2009]. Общее глобальное адресное пространство позволяет всем переменным в приложении иметь уникальные адреса. Такая архитектура памяти, когда она предоставляется приложениям средствами программирования и системой времени выполнения, может дать несколько основных преимуществ.
Во-первых, можно разработать новые системы времени выполнения, которые позволят центральным и графическим процессорам получать доступ ко всему объему данных приложения в рамках традиционных моделей защиты. Такая возможность позволит приложениям использовать систему с одним указателем для доступа к переменным приложения, устраняя сбивающий с толку аспект текущей модели программирования CUDA, когда разработчики не должны разыменовать указатель на память устройства в функциях хоста.
Эти переменные могут находиться в физической памяти ЦП, физической памяти ГП или даже в обеих.Среда выполнения и оборудование могут реализовать поддержку миграции и согласованности данных, как в системе GMAC [GNS 2009]. Если функция ЦП разыменовывает указатель и обращается к переменной, сопоставленной с физической памятью графического процессора, доступ к данным все равно будет обслуживаться, но, возможно, с большей задержкой. Такая возможность позволит программам CUDA более легко вызывать устаревшие библиотеки, которые не были перенесены на графические процессоры. В текущей архитектуре памяти CUDA разработчик должен вручную передавать данные из памяти устройства в память хоста, чтобы использовать унаследованные библиотечные функции для их обработки на ЦП.GMAC построен на текущем API среды выполнения CUDA и дает разработчику возможность либо полагаться на систему времени выполнения для обслуживания таких обращений, либо вручную передавать данные для оптимизации производительности. Однако в настоящее время система GMAC не имеет чистого механизма для поддержки нескольких графических процессоров. Новые возможности виртуальной памяти позволили бы реализовать гораздо более элегантную реализацию.
В конечном итоге, виртуальная память также активирует механизм, аналогичный функции нулевого копирования в CUDA 2.2, чтобы позволить графическому процессору напрямую обращаться к очень большим системным системным памяти физического процессора. В некоторых прикладных областях, таких как САПР, объем физической памяти ЦП может достигать сотен гигабайт. Эти системы физической памяти необходимы, потому что приложения требуют, чтобы весь набор данных находился «в ядре». В настоящее время для таких приложений невозможно использовать преимущества вычислений на GPU. Благодаря возможности прямого доступа к очень большой физической памяти ЦП, для графических процессоров становится возможным ускорять эти приложения.
Второе потенциальное преимущество состоит в том, что совместно используемое глобальное адресное пространство позволяет осуществлять прямую одноранговую передачу данных между устройствами в системе из нескольких устройств. Это поддерживается в CUDA 4.0 и более поздних версиях с помощью функции GPUDirect ™. В старых системах CUDA устройства должны сначала передать данные в память хоста, прежде чем доставить их на одноранговое устройство. Совместное глобальное адресное пространство позволяет реализовать систему времени выполнения, чтобы предоставить API для прямой передачи данных из памяти одного устройства в память другого устройства.В конечном итоге система времени выполнения может быть спроектирована для автоматизации таких передач, когда устройства ссылаются на данные в памяти друг друга, но все же позволяет использовать явные API передачи данных для оптимизации производительности. В CUDA 5.0 можно не только ссылаться на данные на других графических процессорах в системе с несколькими графическими процессорами, но также на данные на графических процессорах в других локальных системах.
Третье преимущество состоит в том, что можно реализовать передачу памяти, относящейся к вводу-выводу, непосредственно в память устройства и из нее. В старых системах CUDA входные данные ввода-вывода должны быть сначала перенесены в память хоста, прежде чем их можно будет скопировать в память устройства.Возможность напрямую передавать данные в память устройства и из нее может значительно снизить стоимость копирования и повысить производительность приложений, обрабатывающих большие наборы данных.
Единое пространство памяти устройства. В ранних моделях памяти CUDA постоянная память, общая память, локальная память и глобальная память формируют свои собственные отдельные адресные пространства. Разработчик может использовать указатели в глобальной памяти, но не другие. Начиная с архитектуры Ферми, эти воспоминания являются частями единого адресного пространства.Это упрощает абстрагирование, какая память содержит конкретный операнд, позволяя программисту иметь дело с этим только во время выделения и упрощая передачу объектов данных CUDA в другие процедуры и функции, независимо от того, из какой области памяти они берутся. Это делает модули кода CUDA более «компонуемыми». То есть функция устройства CUDA теперь может принимать указатель, который может указывать на любое из этих воспоминаний. Код будет работать быстрее, если указатель аргумента функции указывает на общую ячейку памяти, и медленнее, если он указывает на глобальную ячейку памяти.Программист по-прежнему может вручную размещать и передавать данные для оптимизации производительности. Эта возможность значительно снизит стоимость создания библиотек CUDA производственного качества.
Настраиваемое кэширование и блокнот. Общая память в ранних системах CUDA служила управляемой программистом оперативной памятью и увеличивала скорость приложений, в которых ключевые структуры данных имели локализованные, предсказуемые шаблоны доступа. Начиная с архитектуры Fermi, общая память была расширена до более крупной встроенной памяти, которая может быть настроена как частично кэш-память и частично общая память, что позволяет охватить как предсказуемые, так и менее предсказуемые шаблоны доступа, чтобы извлечь выгоду из встроенной памяти. объем памяти.Эта возможность настройки позволяет программистам распределять ресурсы в соответствии с тем, что лучше всего подходит для их приложения.
Приложения на ранней стадии проектирования, которые переносятся непосредственно из кода ЦП, получат большую выгоду от кэширования как доминирующей части встроенной памяти. Это еще больше упростит процесс настройки производительности за счет повышения уровня «легкой производительности», когда разработчик переносит приложение ЦП на ГП.
Существующие приложения CUDA и те, которые имеют предсказуемые шаблоны доступа, будут иметь возможность увеличить использование быстрой разделяемой памяти в три раза, сохраняя при этом ту же «занятость» устройства, что и на устройствах предыдущего поколения.Для приложений CUDA, производительность или возможности которых ограничены размером разделяемой памяти, трехкратное увеличение размера будет долгожданным улучшением. Например, при вычислении трафарета, таком как методы конечного объема для вычислительной гидродинамики, состояние, загруженное в общую память, также включает в себя элементы «ореола» из соседних областей.
Относительная часть ореола уменьшается с увеличением размера трафарета. В трехмерных имитационных моделях ячейки ореола могут быть сопоставимы по размеру данных с основными данными для текущих размеров разделяемой памяти.Это может значительно снизить эффективность разделяемой памяти из-за того, что значительная часть пропускной способности памяти тратится на загрузку элементов ореола. Например, если общая память позволяет блоку потока загружать шаблон ячеек 8 3 (= 512) в общую память с одним слоем элементов ореола на каждой поверхности, только 6 3 (= 216), или менее половины загруженных ячеек, являются основными данными. Пропускная способность, затрачиваемая на загрузку элементов ореола, на самом деле больше, чем затраты на основные данные.Трехкратное увеличение размера разделяемой памяти позволяет некоторым из этих приложений иметь более подходящий размер трафарета, когда ореол составляет гораздо меньшую часть данных в разделяемой памяти. В нашем примере увеличенный размер позволит загружать плитку 11 3 (= 1331) каждым блоком потока. С одним слоем элементов ореола на каждой поверхности, всего 9 3 (= 729) ячеек, или более половины загруженных элементов, являются основными данными. Это значительно улучшает эффективность использования пропускной способности памяти и производительность приложения.
Расширенные атомарные операции. Атомарные операции в Fermi намного быстрее, чем в предыдущих системах CUDA, а атомные операции в Kepler все еще быстрее. Кроме того, атомарные операции Кеплера более общие. Атомарные операции часто используются в схемах вычисления случайного разброса, таких как гистограммы. Более быстрые атомарные операции уменьшают потребность в преобразованиях алгоритмов, таких как сумма префиксов (Глава 9) [SHZ 2007] и сортировка [SHG 2009] для реализации таких вычислений случайного рассеяния.Эти преобразования имеют тенденцию увеличивать количество вызовов ядра, необходимых для выполнения целевых вычислений. Более быстрые атомарные операции также могут снизить потребность в участии центрального процессора в алгоритмах, которые выполняют коллективные операции или где несколько блоков потоков обновляют общие структуры данных, и, таким образом, уменьшают нагрузку на передачу данных между центральным процессором и графическим процессором.
Расширенный доступ к глобальной памяти. Скорость произвольного доступа к памяти в Fermi и Kepler намного выше, чем в более ранних системах CUDA.Программисты могут меньше беспокоиться о слиянии памяти. Это позволяет использовать больше алгоритмов ЦП напрямую в ГП в качестве приемлемой основы, дополнительно сглаживая путь переноса приложений, которые обращаются к разнообразным структурам данных, таким как трассировка лучей, и другим приложениям, которые в значительной степени объектно-ориентированы и могут быть трудными для преобразовать в идеально уложенные массивы.
ubuntu - WSL 2: запуск графических приложений Linux для рабочего стола из оболочки Windows 10 Bash «Ошибка E233: не удается открыть дисплей»
Следующие инструкции были скопированы и вставлены из статьи, которую я написал, но потерял исходное форматирование, ссылки и снимки экрана:
Источник: Как установить рабочий стол Ubuntu с графическим пользовательским интерфейсом в WSL2
Загрузить VcXsrv: Посетите официальный сайт Нажмите "Скачать"
Установите VcXsrv: Откройте «vcxsrv-64.1.20.8.1.installer.exe " Нажмите "Далее" Нажмите "Установить". Нажмите "Закрыть"
Разрешить доступ к VcXsrv: Отметьте «Частные сети» Нажмите "Разрешить доступ"
Откройте PowerShell: Нажмите «⊞ Windows». Введите "PowerShell" в строку поиска. Щелкните правой кнопкой мыши «Windows PowerShell». Нажмите «Запуск от имени администратора»
Открыть WSL2: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
WSL
Установите рабочий стол Ubuntu: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
sudo apt --yes install ubuntu-desktop
Задайте переменную имени пользователя: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
имя пользователя = $ (wslvar ИМЯ ПОЛЬЗОВАТЕЛЯ)
Создайте каталог Ubuntu: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
mkdir --parents / mnt / c / users / $ username /.убунту /
Откройте каталог Ubuntu: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
компакт-диск /mnt/c/users/$username/.ubuntu
Загрузите репозиторий программного обеспечения Linux для продуктов Microsoft: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
Ubuntu 20.04: wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb --output-document packages-microsoft-prod.deb
Ubuntu 18.04: wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb --output-document packages-microsoft-prod.deb
Установить репозиторий программного обеспечения Linux для продуктов Microsoft: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
sudo dpkg --install packages-microsoft-prod.deb
Обновите репозитории: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
обновление sudo apt
Установите APT Transport для HTTPS: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
sudo apt install --yes apt-transport-https
Обновите репозитории: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
обновление sudo apt
Установить.Сеть: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
sudo apt install --yes dotnet-sdk-5.0
Добавить Arkane Systems в каталог со списком источников: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
sudo sh -c 'echo "deb [доверенный = да] https://wsl-translinux.arkane-systems.net/apt/ /"> /etc/apt/sources.list.d/wsl-translinux.list '
Обновите репозитории: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
обновление sudo apt
Установить Genie: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
sudo apt install --yes systemd-genie
Создайте файл Sudoers: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
echo "$ USER ALL = (ALL) NOPASSWD: / usr / bin / genie" | sudo EDITOR = "tee" visudo --file / etc / sudoers.г / $ ПОЛЬЗОВАТЕЛЯ
Создайте сценарий рабочего стола: Скопируйте код из нижеприведенных инструкций Вставьте код в PowerShell Нажмите "Enter"
# СОЗДАТЬ СЦЕНАРИЙ BASH
# Сохранить блок текста с здесь документом
create_bash_script = $ (cat << end_of_string
# Определить необходимые переменные среды
export DISPLAY = "\ $ (cat /etc/resolv.conf | grep nameserver | awk '{print \ $ 2}'): 1.0"
экспорт DESKTOP_SESSION = "ubuntu"
экспорт GDMSESSION = "ubuntu"
экспорт XDG_SESSION_DESKTOP = "ubuntu"
экспорт XDG_CURRENT_DESKTOP = "ubuntu: GNOME"
экспорт XDG_SESSION_TYPE = "x11"
экспорт XDG_BACKEND = "x11"
экспорт XDG_SESSION_CLASS = "пользователь"
экспорт XDG_DATA_DIRS = "/ usr / local / share /: / usr / share /: / var / lib / snapd / desktop"
экспорт XDG_CONFIG_DIRS = "/ etc / xdg"
экспорт XDG_RUNTIME_DIR = "\ $ HOME / xdg"
экспорт XDG_CONFIG_HOME = "\ $ HOME /.config "
экспорт XDG_DATA_HOME = "\ $ HOME / .local / share"
экспорт XDG_CACHE_HOME = "\ $ HOME / .cache"
экспорт XDG_DESKTOP_DIR = "\ $ HOME / Desktop"
экспорт XDG_DOCUMENTS_DIR = "\ $ HOME / Documents"
экспорт XDG_DOWNLOAD_DIR = "\ $ HOME / Загрузки"
экспорт XDG_MUSIC_DIR = "\ $ HOME / Музыка"
экспорт XDG_PICTURES_DIR = "\ $ HOME / Картинки"
экспорт XDG_PUBLICSHARE_DIR = "\ $ HOME / Public"
экспорт XDG_TEMPLATES_DIR = "\ $ HOME / Templates"
экспорт XDG_VIDEOS_DIR = "\ $ HOME / Видео"
# Запустить среду рабочего стола
гном-сеанс
end_of_string
)
# Сохранять переменную окружения имени пользователя в нижнем регистре
имя пользователя = $ (wslvar ИМЯ ПОЛЬЗОВАТЕЛЯ | awk '{print tolower ($ 0)}') &&
# Сохранить блок текста в файле bash
echo "$ {create_bash_script}"> "/ mnt / c / users / $ username /.ubuntu / 02_start_desktop.sh "
Загрузите образы ярлыков: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
wget https://assets.ubuntu.com/v1/9fbc8a44-circle-of-friends-web.zip
Разархивируйте образы ярлыков: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
распаковать -o 9fbc8a44-circle-of-friends-web.zip
Создайте ярлык: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
convert -размер 64x64./circle-of-friends-web/png/cof_orange_hex.png ubuntu.ico
Выход из WSL2: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
выход
Создайте сценарий VcXsrv: Скопируйте код из нижеприведенных инструкций Вставьте код в PowerShell Нажмите "Enter"
# RELOAD VCXSRV SCRIPT
# Сохранять переменную окружения имени пользователя в нижнем регистре
$ username = $ env: username.tolower ()
# Сохраняем блок текста со строкой здесь
$ reload_vcxsrv_script = @ "
# Остановить процесс vcxsrv, содержащий "1.0 "в заголовке окна программы
get-process vcxsrv | где {`$ _. mainwindowtitle -like" * 1.0 * "} | стоп-процесс
# Запускаем процесс vcxsrv в большом окне программы на дисплее номер один
start-process "c: \ program files \ vcxsrv \ vcxsrv.exe" -argument ": 1 -ac -nowgl -multimonitors -dpms"
"@
# Сохранить блок текста в файле PowerShell
echo "$ {reload_vcxsrv_script}"> $ env: userprofile / .ubuntu / reload_vcxsrv.ps1
Создайте сценарий Ubuntu: Скопируйте код из нижеприведенных инструкций Вставьте код в PowerShell Нажмите "Enter"
# СОЗДАТЬ ВИЗУАЛЬНЫЙ БАЗОВЫЙ СЦЕНАРИЙ
# Сохранять переменную окружения имени пользователя в нижнем регистре
$ username = $ env: имя пользователя.понижать()
# Сохраняем блок текста со строкой здесь
$ create_vbs_script = @ "
'Запустить скрипт PowerShell в фоновом режиме
установить application = createobject ("shell.application")
application.shellexecute "powershell", "-file c: \ users \ admin \ .ubuntu \ 01_reload_vcxsrv.ps1", "", "", 0
'Разрешить выполнение сценария PowerShell
wscript.sleep 3000
'Запустить сценарий Bash в фоновом режиме
установить shell = createobject ("wscript.shell")
shell.run "wsl sudo genie -c bash /mnt/c/users/admin/.ubuntu/02_start_desktop.sh", 0
"@
# Сохранить блок текста в файле bash
echo "$ {create_vbs_script}"> $ env: userprofile /.ubuntu / 03_start_ubuntu.vbs
Создайте сценарий быстрого доступа: Скопируйте код из нижеприведенных инструкций Вставьте код в PowerShell Нажмите "Enter"
# Сохраняем блок текста со строкой здесь
$ create_shortcut_script = @ "
# Определить переменные местоположения
`$ shortcut_location =" `$ env: userprofile \ .ubuntu \ Ubuntu.lnk"
`$ program_location =" `$ env: userprofile \ .ubuntu \ 03_start_ubuntu.vbs"
# Создать ярлык
`$ объект = новый-объект -comobject wscript.shell
`$ shortcut =` $ object.createdhortcut (`$ shortcut_location)
`$ shortcut.targetpath =` $ program_location
`$ shortcut.iconlocation =" `$ env: userprofile \ .ubuntu \ ubuntu.ico"
`$ shortcut.save ()
"@
# Сохранить блок текста в файле PowerShell
echo $ create_shortcut_script> $ env: userprofile / .ubuntu / 04_create_shortcut.ps1
Откройте каталог Ubuntu: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
компакт-диск c: \ users \ admin \ .ubuntu
Создайте ярлык: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
PowerShell.exe -файл. \ 04_create_shortcut.ps1
Откройте каталог в проводнике: Скопируйте команду ниже этих инструкций Вставьте команду в PowerShell Нажмите "Enter"
исследователь.
Запустите рабочий стол Ubuntu: Дважды щелкните ярлык «Ubuntu»
Открытый терминал: Нажмите "Действия" в верхнем левом углу.