Модуль проектирования Toolbox в TSMaster позволяет любому на Python создавать профессиональные пользовательские интерфейсы TSMaster и встраивать их в свои проекты. В первой части серии — средство разработки Toolbox: персистентность окон, подсказки синтаксиса Python и структура кода класса формы.
Ключевые слова: Toolbox, Python, TSForm, персистентность, Visual Studio Code.
1. Персистентность Toolbox
Откройте TSMaster, перейдите в «Приложение» и нажмите значок среды разработки Toolbox — откроется интерфейс среды. Появится новый значок, а справа от него — Toolbox TSMaster: этот значок связывает созданные пользователем интерфейсы. В среде разработки уже есть два готовых Toolbox: окно передачи CAN-сообщений и руководство по проектированию Toolbox (рис. 1).

Нажмите кнопку запуска справа от Toolbox — окно появится под ссылкой Toolbox TSMaster; его можно перетаскивать и масштабировать. Кнопка «закрыть» в правом верхнем углу по умолчанию скрывает окно — вернуть его можно из выпадающего списка; кнопка «удалить» удаляет окно навсегда. Каждый запуск создаёт новое окно с независимой конфигурацией (рис. 2).

Изменим конфигурацию: например, заменим 0x123 на 0x321, расположим окна, создадим новую страницу, вытащим на неё одно-два окна, сохраним проект и закроем TSMaster. Откроем TSMaster снова с тем же проектом — окна Toolbox и компоновка останутся как перед закрытием: левое окно с изменённым ID 0x321, правое — с исходным 0x123. Это и есть персистентность Toolbox (рис. 3).

2. Подсказки синтаксиса Python
В среде разработке выберите Toolbox и дважды щёлкните соответствующую строку — откроется окно редактирования кода: все визуальные элементы Toolbox и вся логика за ними содержатся в одном Python-файле. Чтобы открыть этот файл в системном редакторе Python, нажмите кнопку «редактировать» на панели инструментов (рис. 4).

Например, если с Python-файлами ассоциирован Visual Studio Code, откроется он. При первом открытии нужно установить пакет поддержки Python: в VS Code найдите «Python» — появится пакет от Microsoft, установите его. После установки код удобно править и сопровождать (рис. 5).

После установки закройте страницу расширений и перейдите в окружение Python. По умолчанию берётся уже установленный на компьютере путь Python — в нём может не быть движка TSMaster, поэтому окружение нужно переключить: без пакета TSMaster подсказки синтаксиса будут давать множество ошибок. Переключите версию Python по умолчанию на Python из каталога установки TSMaster — и подсказки синтаксиса заработают (рис. 6).

Нажмите Ctrl+K+0, чтобы свернуть код, и посмотрите его структуру: в файле всего три части. Первая — import TSMaster: типовая информация из пакета поддержки TSMaster. Вторая — определение класса формы, наследующего внутренний TSForm. Третья — функция main для создания и запуска отдельной от TSMaster автономной программы. Дальше разберём вторую часть — код класса формы.
3. Код класса формы
Он состоит из двух блоков: функции init и пользовательских функций. Разверните init — внутри много кода интерфейса. Например, поле Label для DLC: найдите соответствующий код в VS Code — он задаёт положение поля свойствами Left, Top, Width, Height и его caption. Этот код можно писать вручную или генерировать автоматически инструментом дизайна форм TSMaster (рис. 7).

Прокрутите до нижней части init: под строкой «Auto Generated Python Code» находится место для пользовательского кода инициализации — там можно создавать элементы управления и настраивать их поведение. Например, строка 247 создаёт кнопку панели инструментов для подключения application; затем её событие OnClick связывается с локальной функцией обратного вызова OnConnectClick. Логика этой функции: вызвать API TSMaster — известный по мини-программам app.connect для подключения application; при успехе возвращается 0.
Проверим в TSMaster: нажмите кнопку подключения на панели инструментов окна — появится сообщение об успешном подключении; кнопки подключения всех форм Toolbox стали серыми, а кнопки отключения — активными. Это работа функций обратного вызова событий TSMaster (рис. 8).

Вернёмся к коду и найдите функцию OnMeasurementStart — она вызывает подфункцию установки состояния кнопок (зажмите Ctrl и перейдите в неё). Логика: если подключение успешно, кнопка подключения серая, кнопка отключения активна, а в строке состояния формы печатается «приложение подключено»; иначе — отключено. Поэтому при нажатии «подключить» показывается «Measurement started», при «отключить» — «Measurement stopped». Причина срабатывания — у формы есть callback Measurement start, которому мы присваиваем нашу функцию: строка self.OnMeasurementStarted Event связывается с внутренней OnMeasurementStart. Теперь при успешном запуске соединения в TSMaster это заметно в любом месте (рис. 9).

Нажмите запуск соединения в TSMaster — состояние кнопок на панелях изменится синхронно. Рассмотренное окно Raw_CAN_Transmit — полноценное демо: передача сырых CAN-сообщений по кнопке, по таймеру или по триггеру от принятого сообщения.