Визуальный конструктор форм для Python + Tkinter, как в Delphi или Visual Studio.
Открывается окно-холст, на который мышью накидываются элементы, у каждого настраиваются
свойства и события, а кнопкой «Выгрузить в Python» форма сохраняется в готовый .py файл.
Возможности
- Палитра из 14 элементов:
Label, Button, Entry, Text, Checkbutton,
Radiobutton, Listbox, Combobox, Spinbox, Scale, Progressbar,
Frame, LabelFrame, Canvas.
- Перетаскивание элементов на форму, перемещение и изменение размера мышью (с привязкой к сетке 5 px).
- Современный дизайн (modern) — генерируется код на
ttk с темой clam,
плоскими кнопками, акцентным цветом, шрифтом Segoe UI и отступами вместо
стандартного «дефолтного» вида Tkinter. Переключатель Дизайн: modern / classic
в свойствах формы; превью на холсте сразу меняет вид.
- Акцентные кнопки (свойство «Акцентная») и настраиваемый акцентный цвет формы.
- Вложенность в контейнеры: элементы, помещённые внутрь
Frame / LabelFrame,
автоматически становятся их дочерними виджетами с относительными координатами.
- Меню окна: строки вида
Файл | Создать=on_new; -; Выход=on_exit превращаются
в полноценный menubar с командами.
- Инспектор свойств: имя переменной, положение/размер, цвет фона и текста, шрифт
(семейство, размер, жирный/курсив), состояние, рамка, текст/заголовок и специфичные
для элемента свойства.
- Вкладка События:
command для кнопок/чек-боксов/ползунков и привязка событий
через bind (<Button-1>, <Return>, <<ComboboxSelected>> и т.д.).
Клик по пустому полю события автоматически создаёт имя обработчика
(<имя>_<событие>); пустой метод появляется в сгенерированном коде.
- Дерево элементов с быстрым выбором и удалением.
- Несколько форм (окон) в одном проекте — вкладки форм над холстом (
+ добавляет,
✕ удаляет). У каждой формы свои элементы, свойства и заголовок.
- Кнопка-дискета 💾 в панели: неактивна, пока нет изменений, и подсвечивается при
правках; клик сохраняет проект (в режиме файла — это
Ctrl+S).
- WYSIWYG: размер холста точно равен клиентской области окна (заголовок окна
вынесен за пределы холста), поэтому позиции и размеры элементов совпадают с запуском.
- Уникальность имён: при сохранении проекта и выгрузке в Python проверяется, что
нет форм с пустым или совпадающим заголовком (иначе — ошибка, дубликаты подсвечены
красным на вкладках).
- Выгрузить в Python — каждая форма сохраняется в отдельный файл
{Заголовок формы}.py
(одна форма — обычный диалог сохранения; несколько — выбор папки). Генерируется
класс-наследник tk.Tk с place()-разметкой.
- Редактирование форм прямо в редакторе: файлы
*.tkform.json открываются
как визуальный редактор (двойной клик в проводнике или ПКМ → «Открыть в
конструкторе Tkinter»). Правки отражаются в документе, сохранение — обычным
Ctrl+S (с индикацией несохранённых изменений).
Запуск (режим разработки)
- Откройте эту папку в VS Code.
- Нажмите
F5 (конфигурация «Запустить расширение») — откроется новое окно
Extension Development Host.
- Вызовите палитру команд
Ctrl+Shift+P → «Tkinter: Открыть конструктор форм»
(или нажмите значок 🪟 на левой панели → «Открыть конструктор»).
- Накидайте элементы, настройте свойства, нажмите «Выгрузить в Python» и выберите,
куда сохранить
.py.
Повторное редактирование формы
Нажмите «Сохранить проект…» — получите файл *.tkform.json. В дальнейшем
двойной клик по этому файлу в проводнике откроет его как визуальный редактор:
меняйте форму и сохраняйте Ctrl+S. Так можно вернуться к ранее созданной форме,
доработать её и заново выгрузить в Python.
Структура
| Файл |
Назначение |
package.json |
Манифест расширения и команда |
extension.js |
Точка входа: webview, диалоги сохранения/открытия |
media/index.html |
Разметка конструктора |
media/style.css |
Стили интерфейса и визуализация виджетов |
media/main.js |
Логика дизайнера и генератор Python-кода |
test/run-codegen.js |
Дымовой тест генератора (node test/run-codegen.js) |
Пример сгенерированного кода
import tkinter as tk
from tkinter import ttk
class DemoApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("DemoForm")
self.geometry("500x380")
self.create_variables()
self.create_widgets()
def create_widgets(self):
self.btnOk = tk.Button(self, text="OK", command=self.on_ok)
self.btnOk.place(x=110, y=60, width=90, height=28)
def on_ok(self):
print("on_ok вызван")
if __name__ == "__main__":
app = DemoApp()
app.mainloop()
Сборка .vsix (опционально)
npm install -g @vscode/vsce
vsce package
Полученный .vsix ставится через Extensions → … → Install from VSIX.
| |