У меня есть генератор фотогалереи, написанный на Ruby. Конфигурация каждой фотогалереи и сам генератор находятся в одном YAML-файле. Этот инструмент уже работает как терминальный инструмент. Теперь я хочу создать для этого графический интерфейс и выбрал Gtk в качестве библиотеки графического интерфейса. Я создал черновой пользовательский интерфейс в Glade, и у меня есть классы как для Gtk::ApplicationWindow, так и для Gtk::Application. Когда я запускаю код Ruby, пользовательский интерфейс, созданный в Glade, действительно загружается/отображается. Теперь я немного застрял в заполнении GTKTreeView, который я хочу использовать для отображения данных конфигурации, чтобы пользователь мог внести последние изменения перед созданием галерей.
Я вставил код, который у меня есть — https://gitlab.com/lipoqil/static-photo-gallery-builder/-/compare/master...gui
Я нашел много примеров на C, но они обычно не связаны с классами, поэтому для меня они бесполезны.
Я также нашел примеры в Ruby, которые не используют Glade и создают весь пользовательский интерфейс программно, создавая вручную экземпляры классов Gtk, и, естественно, затем они имеют ссылку в переменной.
Я нашел несколько видеороликов о том, как делать что-то подобное на Python, но там просто прикреплялись действия к кнопкам, поэтому им не требовалась ссылка на конкретный элемент пользовательского интерфейса.
Как мне получить ссылку на GTKTreeView/GTKListStore, чтобы я мог ее заполнить?
Я представляю, что мне нужно вызвать .get_object('<id I've set in Glade>')
по какому-то поводу, но понятия не имею, по какому поводу.
Если из «Что я пробовал» неясно… Я не ищу, например, C или пример, где весь пользовательский интерфейс выполнен программно.
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]
3.40.0
(из Homebrew для macOS)3.24.41
(из Homebrew на macOS, с использованием Gtk 3, поскольку Glade несовместим с Gtk 4)gtk3 (4.2.2)
(из рубиновых драгоценных камней)Я спросил
Вероятно, я искал bind_template_child
. Вы присваиваете ему идентификатор из представления Glade, и после инициализации класса окна он становится переменной экземпляра.
module StaticPhotoGalleryGenerator
module GUI
class ApplicationWindow < Gtk::ApplicationWindow
type_register
class << self
def init
# Set the template from the resources binary
set_template resource: '/cz/rooland/static-photo-gallery-generator/ui/application_window.glade'
bind_template_child('config_store1')
bind_template_child('generate_button')
end
end
def initialize(application)
super application: application
puts @config_store1.inspect # #<Gtk::ListStore:0x00000001437d1998 ptr=0x0000600000de20b0>
end
end
end
end
Я отмечу это как ответ, но время от времени буду проверять этот вопрос, если человек не нашел лучшего решения;)
Мне кажется, запрещена только копипаста AI, потому что она раздувалась. Я поговорил с ChatGPT, а затем сам написал ответ, основываясь на коде, который я получил из этого чата. Окончательный код я тоже написал сам.
Рад, что у вас все заработало, и спасибо, что хотя бы написали свой ответ. Ответы ChatGPT технически запрещены для SO (Meta.stackoverflow.com/questions/421831/…), так что, возможно, просто отредактируйте эту часть ¯\_(ツ)_/¯