Рассмотрим пример проектирования стандартного оконного приложения. Простейшая последовательность действий:
1) визуальное проектирование интерфейса (перенос на форму с Панели элементов необходимых визуальных и не визуальных элементов);
2) генерация заготовок методов обработки событий, связанных с элементами управления;
3) программирование методов обработки событий.
Постановка задачи
Создать текстовый редактор с обязательными функциями работы с файлами «Открыть» и «Сохранить как», а также функциями редактирования текста. Выбор действий с файлами осуществлять через главное меню.
Реализация
Разместим на форме визуальный элемент textBox1 класса TextBox. Размер элемента сделайте чуть меньше размера формы, сместив его вниз от заголовка на 30-40 пикселей. Задайте свойство textBox1.MultiLine = true (для редактирования текста в несколько строк).
Перетащите с Панели элементов компонент menuStrip1 класса MenuStrip для создания меню.В левом верхнем углу рабочей области формы появится кнопка «Введите здесь» , а на панели невизульных компонентов отобразится элемент menuStrip1.
Как создать программу «КАЛЬКУЛЯТОР» в блокноте
Для выбора имен файлов для их чтения и записи перетащим на эту же панель элементы openFileDialog1 (класс OpenFileDialog) и saveFileDialog1 (класс SaveFileDialog).
Кликнув по кнопке «Введите здесь», введите имя раздела меню «Файл» и добавьте ниже следующие пункты меню работы с файлами «Открыть», «Сохранить как» и «Выход». Ваша форма (вместе с панелью невизуальных элементов) будет выглядеть примерно так:
Примечание: для наглядности изменено свойство формы BackColor = Color.Peru. Первая группа действий закончена.
Вторая группа действий обеспечивает генерацию заголовков методов обработки событий, связанных к кнопками меню. Для этого дважды нажмите каждую из трех позиций меню, а также событию Load формы Form1 на закладке «События» панели «Свойства» поставьте в соответствие метод Form1_Load (двойной клик справа от в строке Load).
Откроем форму в режиме Кода (файл Form1.cs):
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ТекстовыйРедактор < public partial class Form1 : Form < public Form1() < InitializeComponent(); >private void открытьToolStripMenuItem_Click(object sender, EventArgs e) < >private void сохранитьКакToolStripMenuItem_Click(object sender, EventArgs e) < >private void выходToolStripMenuItem_Click(object sender, EventArgs e) < >private void Form1_Load(object sender, EventArgs e) < >> >
Перейдем к третьей группе действий — написанию кода для этих четырех методов.
Метод Form1_Load( ) используем для очистки поля компонента textBox1, для задания форматов файловых диалогов и имени файла — контрольного примера при его открытии:
Уроки по С++.1 урок.Как создать программу?
private void Form1_Load(object sender, EventArgs e)
Комментарий. При загрузке формы мы задаем свойство FileName объекта openFileDialog1 указанием имени файла для открытия, а также задаем фильтры для диалогов открытия и сохранения файлов. Сравните работу программы без использования этого метода.
В методе открытьToolStripMenuItem_Click( ) используется компонент openFileDialog1 для выбора имени файла для чтения. Если имя не выбрано (FileName = String.Empty), то работа метода завершается. Иначе создается новый экземпляр класса System.IO.StreamReader (var Читатель) с указанием имени файла и кодировки, данные из текстового файла переносятся в textBox1, объект Читатель закрывается. Добавлена обработка исключений, которые могут возникнуть при открытии файла:
private void открытьToolStripMenuItem_Click(object sender, EventArgs e) < openFileDialog1.ShowDialog(); if (openFileDialog1.FileName == String.Empty) return; // Чтение текстового файла try < var Читатель = new System.IO.StreamReader( openFileDialog1.FileName, Encoding.GetEncoding(1251)); textBox1.Text = Читатель.ReadToEnd(); Читатель.Close(); >catch (System.IO.FileNotFoundException Ситуация) < MessageBox.Show(Ситуация.Message + «nНет такого файла», «Ошибка», MessageBoxButtons.OK, MessageBoxIcon.Exclamation); >catch (Exception Ситуация) < // отчет о других ошибках MessageBox.Show(Ситуация.Message, «Ошибка», MessageBoxButtons.OK, MessageBoxIcon.Exclamation); >>
Аналогично выполняется запись (сохранение) текстового файла:
private void сохранитьКакToolStripMenuItem_Click(object sender,EventArgs e) < saveFileDialog1.FileName = openFileDialog1.FileName; if (saveFileDialog1.ShowDialog() == DialogResult.OK) < try < var Писатель = new System.IO.StreamWriter( saveFileDialog1.FileName, false, System.Text.Encoding.GetEncoding(1251)); Писатель.Write(textBox1.Text); Писатель.Close(); >catch (Exception Ситуация) < // отчет о других ошибках MessageBox.Show(Ситуация.Message, «Ошибка», MessageBoxButtons.OK, MessageBoxIcon.Exclamation); >> >
Последний метод — закрытие формы — реализуется одним оператором:
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
Подготовим в блокноте текстовый файл Text2.txt и разместим его в подкаталоге data папки, где будет размещено ваше приложение. Запустим программу на выполнение. Добавьте в окне редактора несколько строк, сохраните файл с другим именем. Откройте новый файл и удалите часть текста в окне редактора.
Заметим, что работают стандартные операции выделения текста, копирования, вставки и удаления части текста с использованием мыши и комбинаций управляющих клавиш, используемых в известных текстовых редакторах.
ВЫВОД: В первом приближении поставленная задача решена. Данный пример приведен всего лишь для понимания:
во-первых, алгоритма действий разработчика визуального приложения «интерфейс, события-методы, реализация»;
во-вторых, удобства использования готовых компонентов (нам не пришлось программировать операции редактирования текста — стандартные события уже привязаны к компоненту textBox1);
в-третьих, целесообразности использования готовых компонентов (файловых диалогов) с точки зрения стандартизации интерфейса пользователя и программы.
Напомним, что в статье про классы мы отмечали, что в языке C# предусмотрено несколько разновидностей данных-членов и функций-членов. Пока мы подробно рассмотрели только поля и константы — как данные-члены, а также методы — как функции-члены класса. В следующих статьях мы рассмотрим события, как данные-члены класса и трехзвенную цепочку события-делегаты-методы. После чего вернемся к член-функциям класса: свойствам, конструкторам, финализаторам, операциям и индексаторам.
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
Источник: c-sharp.pro
Как сделать Data Science приложение для Windows (и не только) с графическим интерфейсом с помощью PySimpleGUI
Работать с Data Science в Jupyter, конечно, очень приятно, но если вы хотите пойти дальше и развернуть свой проект или модель на облачном сервере, то здесь есть много отличных решений — с помощью Flask, Django или Streamlit. Хотя облачные решения по-прежнему самые популярные, часто хочется создать быстрое приложение с графическим интерфейсом. Например:
- Модель ML тестируется на различных наборах данных. Вы можете перетащить файлы CSV в модель и отрисовать кривую AUS/ROC. Здесь GUI проявит себя прекрасно, правда?
- Построить случайную переменную или статистическое распределение в заданном диапазоне и динамически управлять параметрами с помощью графического интерфейса.
- Быстро запустить некоторые задачи обработки или предварительной обработки данных в наборе с помощью GUI вместо того, чтобы писать кучу кода.
Что такое PySimpleGUI?
В экосистеме Python есть несколько очень популярных GUI-фреймворков, таких как Tkinter, PyQt и т. д. Но часто они несколько раздуты и трудны в изучении для специалистов по Data Science, которые могут захотеть написать простое приложение с минимумом кода, а не тратить время на разработку крупной программы с графическим интерфейсом на уровне энтерпрайза.
Обёртка, которую легко изучить
На сайте PySimpleGUI написано: «Python GUI для людей —трансформирует Tkinter, Qt, Remi, WxPython в портативные Pythonic-интерфейсы, дружественные людям». По сути, этот GUI-фреймворк берёт все эти популярные и хорошо зарекомендовавшие себя GUI-фреймворки и обёртывает их в единую библиотеку, которую просто изучить и затем собирать приложения.
Вам даже не нужно писать определение класса, чтобы создать GUI-приложение! Часто специалисты по Data Science не имеют достаточно опыта в разработке.
Они могут извлечь огромную пользу из изучения и применения инструмента, который даёт возможность создавать небольшие целевые приложения с графическим интерфейсом для изучения данных, их анализа, экспериментов с моделями ML и т. д. Поэтому я создал репозиторий, чтобы заполнять его короткими, целенаправленными скриптами, которые при запуске создают настольные приложения. Вот этот репозиторий. В сети уже есть несколько хороших туториалов о PySimpleGUI. В моём репозитории я уделяю особое внимание созданию простых демонстрационных программ, связанных с наукой о данных (простая аналитика, статистическое моделирование, визуализации и базовое машинное обучение), с использованием этого мощного инструмента построения графического интерфейса.
Преимущества обёртки
- Не нужно никаких обратных вызовов.
- Чтобы сократить объём кода, используются конструкции Python. Например, виджет настраивается прямо на месте, в котором он должен быть, а не на расстоянии нескольких строк кода от этого места.
- Зависит от одного пакета: обёртывает Tkinter и не требует установки других пакетов.
- Одна и та же программа с GUI может выполняться на нескольких платформах, включая веб-браузер, без изменения исходного кода, за исключением оператора импорта.
- Можно разрабатывать интерфейс для нескольких платформ ОС — Windows, Linux, Raspberry Pi и Android (PyDroid3) — с очень незначительными изменениями.
В принципе, можно начать создавать работающие (и полезные) приложения с GUI, имея базовые знания Python, и вы справитесь за день.
Примеры приложений
Установите библиотеку вот так: pip install pysimplegui . Чтобы запустить примеры, вам также понадобятся эти библиотеки:
- Numpy.
- Pandas.
- Matplotlib.
- Scikit-learn.
- Seaborn.
Data Science «Hello World»
Простейшая программа в PySimpleGUI отобразит строку Hello World в маленьком окне. Но, в духе DS, давайте сделаем нашу вводную программу интереснее и полезнее! Вот скрипт. Назовём его GenRandom.py .
Перейдите в каталог с этим скриптом, выполните команду python GenRandom.py . Вы увидите простое всплывающее окно, в котором можно нажать кнопку, чтобы вызвать функцию обновления (см. код выше), чтобы сгенерировать случайное число от 1 до 99.
Хотя это очень простой сценарий, в нём есть:
- макет (с аргументами стиля, например size и font ) и окно;
- элемент кнопки, который вызывает внешнюю функцию (событие);
- функция обновления текстового элемента в объекте окна.
Другие виджеты
Вот еще один сценарий, иллюстрирующий другие виджеты. Просто запустите команду:
python FontUpdate.py
Вы увидите всплывающее окно, в котором сможете динамически обновлять шрифт текста. Вот демонстрационное видео:
Решатель уравнений
Запустите команду python QuadraticEquation.py и вы увидите всплывающее окно, в котором можно ввести коэффициенты квадратного уравнения, чтобы решить его (даже если корни окажутся комплексными числами!).
Анализатор Pandas DataFrame
В этом примере мы показываем, как легко создать GUI, который взаимодействует с широко используемым объектом, например с Pandas DataFrame. Как обычно, вы запускаете скрипт командой python SimpleDataFrame.py. Вначале он запросит у вас файл набора данных (CSV).
При нажатии на кнопку «Обзор» сначала появится диалоговое окно просмотра файлов. Убедитесь, что вы выбрали подходящий для этой демонстрации набор данных.
После выбора cars.csv появятся другие запросы:
Если вы нажмёте Yes на последней подсказке, то увидите набор данных, который был прочитан в новом окне:
После закрытия этого окна появится новое всплывающее окно с вопросом о том, хотите ли вы посмотреть описательную статистику этого набора данных. Если вы нажмете Yes, то увидите нечто подобное:
После закрытия этого окна ещё одно всплывающее окно спросит о том, хотите ли вы увидеть пример графика. Если вы нажмете Yes, то увидите что-то вроде этого:
Генератор случайных диаграмм рассеяния
Это приложение предназначено, чтобы продемонстрировать возможность создания динамического графика, который взаимодействует с пользователем. Скрипт лежит здесь. Когда вы запустите его, появится окно с простой кнопкой, которую вы можете нажимать столько раз, сколько хотите, каждый раз генерируя график случайного рассеяния. Под капотом, конечно, Numpy и Matplotlib.
Приложение для подгонки кривой
Специалисты по DS и аналитики всегда подгоняют кривые или аналитические функции под некоторые данные. Легко создать простое приложение, где вы сможете продемонстрировать это с помощью PySimpleGUI.
Ядро — это скрипт. При запуске появляется окно с кнопками для генерации и установки полиномиальной функции 2-й степени. Более того, мы также установили небольшой ползунок, чтобы настроить уровень гауссовского шума, который добавляется к данным. Вкратце в этом примере показывается, как основные функции подбора данных интегрируются в легкий графический интерфейс:
Пример обучения модели Scikit-learn
Наконец-то мы снисходим до примера настоящего ML. Мы покажем, как построить простое приложение, позволяющее загрузить набор данных Pima Indians diabetes и обучить модель Случайного леса на этих данных с помощью Scikit-learn в фоновом режиме. Скрипт лежит здесь. На рисунке ниже показывается работа этой программы с графическим интерфейсом. Обратите внимание, что она охватывает стандартные процессы, как ожидается от программы машинного обучения:
- загрузка набора данных;
- опции для сброса значений NaN и указания на то, есть ли в колонках заголовки;
- отображение набора данных;
- отображение описательной статистики;
- выбор выходного столбца из списка, который автоматически заполняется, когда загружается набор данных;
- простая проверка на ошибки для выходной колонки;
- запуск алгоритма классификации в фоновом режиме и отображение точности в графическом интерфейсе:
Резюме
Заплатка на асме. Создаем панель инструментов для Windows на Flat Assembler
В этой статье я расскажу о том, как создать простое приложение — заготовку панели инструментов для рабочего стола Windows. По ходу дела мы вспомним Win32 API, разберемся, как его использовать на языке ассемблера, и познакомимся с Flat Assembler, который станет для нас основным инструментом разработки.
Нет в мире совершенства
Народная молва гласит, что в основе мироздания лежит закон подлости, из которого следуют все остальные фундаментальные законы природы. К таковым относится и закон неубывающей энтропии, в соответствии с которым материальные предметы со временем приходят в негодность. На моем мониторе этот закон проявился в виде горизонтальных полос в верхней части экрана, которые выглядят как нотный стан, если под ними радикально черный фон, и как интерференционная картина в двухщелевом эксперименте, если фон светлый.
Ознакомившись с обзорами аналогичных проблем по роликам на YouTube, я составил для себя общее представление об этом дефекте. Он может быть вызван либо плохим контактом шлейфа, соединяющего матрицу монитора с контроллером, либо неисправностью в электронных компонентах самого контроллера. Поскольку гарантийный срок уже закончился, я разобрал монитор и пришел к выводу, что с отсутствием опыта и инструментов шансы на успешный ремонт у меня примерно 50 на 50: либо устраню дефект, либо испорчу все окончательно.
Какие еще остаются варианты? Знаю по опыту, что официальный сервис, скорее всего, выставит заградительную цену, а отдавать боевого товарища в очумелые ручки кустаря‑одиночки совесть не позволяет. Наиболее здравой кажется мысль пойти в ближайший магазин, купить новый монитор и не дурить голову ни себе, ни читателям. Именно так я бы и поступил, если бы монитор не работал совсем. Но он почти работает, и выбрасывать его попросту жалко.
А ведь если подумать, ремонт необязательно предполагает восстановление исходного качества изделия — зачастую допускается некоторая утрата потребительских свойств. Как, например, поступает хакер, обнаружив в один прекрасный день дыру. нет, не в безопасности, а в любимых домашних брюках?
Достает свой толстый кошелек и спешит в ближайший бутик за новыми? Нет, он вспоминает уроки Марьванны и, применяя методологию «вперед иголка», накладывает заплатку! Или другой пример. В не менее прекрасный день инженеры NASA обнаружили, что основная антенна радиосвязи запущенного к Юпитеру зонда не раскрылась полностью.
Разве они бросили неисправное устройство на произвол судьбы и обратились к правительству за финансированием нового? Нет, они проявили находчивость и техническую смекалку, в результате чего пусть и не без труда, но успешно провели многолетнюю исследовательскую миссию.
Выбор цели и средства
Рассматриваемая в статье ситуация находится где‑то между этими крайними случаями. Наибольшие неудобства описанный дефект доставляет при использовании развернутых на весь экран программ, потому что попадает либо на адресную строку браузера, либо на главное меню приложения. Использование же программ в оконном режиме, с подгонкой их местоположения после каждого запуска, грозит нервным расстройством. Я готов пожертвовать частью полезной площади экрана, если изображение не будет попадать на дефектную область.
Основная операционная система на моем компьютере — Windows. Как исключить полосу в верхней части экрана из доступного пространства рабочего стола, чтобы окна приложений при развертывании не попадали на нее? Идею мне подсказала панель задач: она монополизирует нижнюю часть экрана и никогда не перекрывается окнами программ.
Может быть, достаточно будет прикрепить ее к верхней части экрана? Нет, во‑первых, она не совсем подходит по размеру, а во‑вторых, сама приобретает неприглядный вид из‑за дефекта. А нельзя ли сделать «заплатку» с такими же свойствами, но чтобы пользователь мог контролировать ее размер и цвет?
Оказывается, можно, и ответ быстро нашелся в справочнике по Win32 API — это панель инструментов рабочего стола. Направление работы прояснилось, осталось выбрать подходящий инструмент для ее выполнения.
Основное средство разработки с использованием Win32 API — компилятор С. Но для вызова нескольких функций операционной системы хочется воспользоваться чем‑то более простым и изящным. Поэтому я отправился в темную кладовую своей памяти и нашел там пыльную шкатулку с плоским монтажником. Если кто‑то еще не догадался, то так звучит по‑русски Flat Assembler в варианте Яндекс‑переводчика. Удивительно, но продукт, с которым я познакомился еще в середине 2000-х, продолжает жить и здравствовать.
Что умеет Flat Assembler?
Давай прямо сейчас разберемся со средой, в которой будем работать. На странице загрузки выбери архив с последней версией сборки для Windows, загрузи его и распакуй куда‑нибудь на диск. В трех мегабайтах папки FASMW есть все, что нам потребуется.
Создай пустую папку Appbar для рабочего проекта и скопируй в нее исходный текст шаблона типового приложения Windows FASMW EXAMPLES TEMPLATE TEMPLATE. ASM . Запусти интегрированную среду разработки FASMW FASMW. EXE и с помощью пункта меню File → Open. загрузи в нее этот файл. Обрати внимание, что в нашем распоряжении есть текстовый многооконный редактор с подсветкой синтаксиса ассемблера.
Шаблон Windows-приложения на ассемблере состоит из следующих основных частей:
- заголовка с указанием формата целевого исполняемого файла и точки входа в приложение;
- секции кода . text , где метка start указывает команду, с которой должно начинаться выполнение программы;
- секции данных . data , содержащей глобальные переменные программы;
- секции импорта . idata , в которой перечислены используемые программой динамические библиотеки и подключаются объявления содержащихся в них функций.
В целом текст программы должен быть понятен любому, кто использовал Win32 API. Во‑первых, сам API предельно прост. Параметры всех функций ожидают 32-битных значений аргументов, а если данные не укладываются в этот размер, то передается 32-битный указатель на массив или структуру опять же 32-битных значений. Исключение, пожалуй, только строки. Возвращаемое функцией значение (например, код завершения) передается через регистр EAX или, если оно превышает 32 бита, через структуру, на которую указывал один из аргументов.
Во‑вторых, Flat Assembler на основе своего набора макроинструкций предлагает синтаксический сахар, который делает использование API максимально приближенным к высокоуровневым языкам программирования. Скажем, довольно сложный вызов функции создания окна описывается одной строкой:
invoke CreateWindowEx , 0 , _class , _title , WS_VISIBLE + WS_DLGFRAME + WS_SYSMENU , 128 , 128 , 256 , 192 , NULL , NULL , [ wc. hInstance ] , NULL
Здесь invoke — это команда вызова подпрограммы в соответствии с соглашением STDCALL, CreateWindowEx — имя вызываемой API-функции, а далее через запятую следуют аргументы в том порядке, в котором они описаны в документации. С‑программисты могут считать, что имена всех переменных здесь — это указатели ( _class , _title ), для разыменования которых используются квадратные скобки ( [ wc. hInstance] ). Отметим привычную «точечную» нотацию доступа к элементам структуры.
Описание оконной процедуры WindowProc тоже не должно вызвать затруднений:
proc WindowProc uses ebx esi edi , hwnd , wmsg , wparam , lparam
Соглашение Win32 API требует, чтобы после возврата из процедур обратного вызова (callback-процедур) значения регистров EBX , ESI и EDI были такими же, как и перед вызовом. Для этого в заголовке присутствует указание на сохранение этих регистров в виде фразы uses ebx esi edi . А дальше через запятую идет список формальных параметров процедуры, которые соответствуют документации.
Теперь ты можешь скомпилировать и выполнить эту программу. Но сначала укажи путь к папке с подключаемыми директивой include файлами в пункте меню Options → Compiler setup так, чтобы он соответствовал фактическому местоположению FASMW INCLUDE . После этого выполни пункт меню Run → Run или просто нажми клавишу F9. Если все было сделано правильно, то в рабочей папке Appbar появится свежесобранный файл TEMPLATE. EXE , а на экране отобразится крошечное окно Win32 program template.
Создание обработчика сообщения WM_CREATE
Со средой разработки разобрались, приступим к работе над программой. Если раньше ты никогда не программировал панели рабочего стола Windows, то сейчас самое время изучить документацию. Но перед этим хочу обратить внимание на основные моменты. Панель рабочего стола не является каким‑то уникальным объектом операционной системы. Роль панели может играть любое окно, созданное функцией CreateWindowEx . Все средства Windows, обеспечивающие функционирование панели, сосредоточены в единственной функции SHAppBarMessage, с помощью которой можно:
- узнать границы области рабочего стола, в пределах которых можно разместить новую панель инструментов;
- зарезервировать на этой области участок для размещения новой панели;
- указать манипулятор ( handle ) окна с панелью, которому будут отправляться системные уведомления, связанные с изменением обстановки на рабочем столе.
После резервирования новой области операционная система запрещает ее использование окнами приложений при их максимизации, освобождает от значков рабочего стола (если таковые на ней были) — и, в общем‑то, всё. За внешний вид панели отвечает ассоциированное с нею окно, которое теоретически должно закрыть собой освобожденное пространство и принять соответствующий стиль. Но по большому счету может этого и не делать.
С помощью пункта меню File → Save as. сохрани открытый в редакторе файл под именем appbar. asm . В нашей программе панелью будет главное окно приложения. Зарезервируем для нее полосу в верхней части рабочего стола. Это можно сделать в обработчике сообщения WM_CREATE , которое отправляется операционной системой окну приложения непосредственно перед тем, как отобразить его на экране. Для этого в начале оконной процедуры WindowProc вставим строки перехода к обработчику сообщения:
cmp [ wmsg ] , WM_CREATE
je . wmcreate
и напишем сам обработчик перед меткой . wmdestroy :
Источник: xakep.ru