Создание интерактивного интерфейса GTK через Lua

#lua #gtk

#lua #gtk

Вопрос:

Я создаю приложение, сильно зависящее от плагинов. Они закодированы на Lua для упрощения и ускорения разработки.

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

Правильный ли мой подход или я должен вместо этого реализовать собственное решение в моей платформе для пользовательского интерфейса?

Ответ №1:

Если вы используете linux или BSD, Lua — это идеальный выбор для GTK. Просто взгляните на проект lua-lgi. После установки вы можете приступить к созданию пользовательского интерфейса за считанные секунды:

 lgi = require'lgi'
Gtk = lgi.require'Gtk'
dialog = Gtk.MessageDialog { text = 'This is a text message.', buttons = 'CLOSE' }
dialog:show_all()
Gtk.main()
  

Самой большой особенностью lgi является то, что он работает для любой библиотеки на основе GObject, например cairo , goffice , gnome-db и многих других.

Если вы используете Windows, вам не повезло. Я создал рабочий установщик, но это скорее проверка концепции, чем реальный проект. Путь к этому был действительно трудным, особенно потому, что gobject-introspection (широко используемый lgi ) еще не является кроссплатформенным.

У меня нет опыта работы с другими ОС.

Комментарии:

1. Я тоже рассматривал это, но моя проблема заключается не в создании пользовательского интерфейса на Lua, а в получении уже загруженного элемента пользовательского интерфейса, чтобы иметь возможность изменять его с помощью скрипта. Возможно ли это сделать?

2. lua-lgi предоставляет тот же API, что и в C: вы можете делать все, что в ваших силах, с простым GTK. Из того, что я понял из вашего запроса, вы можете легко получить виджеты из GtkBuilder (т.е. из XML-файла, сгенерированного glade) и отредактировать их любым возможным способом.

3. Если это так, то это, вероятно, лучший способ достичь моей цели. Единственная проблема — это кроссплатформенность, но мне придется поискать решения позже. Спасибо за помощь!