Выявление и сокрытие поиска - Gtk

Фон

Это часть упражнения, в котором я создаю небольшой текстовый редактор в genie. Приложение пока работает очень хорошо.

цель

Я застрял в создании поля ввода поиска, которое открывается после нажатия на кнопку поиска на панели заголовков.

Код

init
    Gtk.init (ref args)

    var app = new Application ()
    app.show_all ()
    Gtk.main ()

// This class holds all the elements from the GUI
class Application : Gtk.Window

    _view:Gtk.TextView
    _filename:string
    _search_button:Gtk.Button
    _search_entry:Gtk.SearchEntry
    _search_entry_revealer:Gtk.Revealer
    _search_button_revealer:Gtk.Revealer
    _search_visible:bool = false

    construct ()

        // Prepare Gtk.Window:
        this.window_position = Gtk.WindowPosition.CENTER
        this.destroy.connect (Gtk.main_quit)
        this.set_default_size (400, 400)


        // Headerbar definition
        headerbar:Gtk.HeaderBar = new Gtk.HeaderBar()
        headerbar.show_close_button = true
        headerbar.set_title("My text editor")

        // Headerbar buttons
        open_button:Gtk.ToolButton = new ToolButton.from_stock(Stock.OPEN)
        open_button.clicked.connect (openfile)

        new_button:Gtk.ToolButton = new ToolButton.from_stock(Stock.NEW)
        new_button.clicked.connect (createNew)

        save_button:Gtk.ToolButton = new ToolButton.from_stock(Stock.SAVE)
        save_button.clicked.connect (saveFile)

        var search_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);
        _search_entry:Gtk.SearchEntry = new Gtk.SearchEntry();
        _search_entry.editable = true;
        _search_entry.visibility = true;
        _search_entry.expand = true;
        _search_entry.max_width_chars = 30;
        _search_entry.margin_right = 12;

        _search_entry_revealer:Gtk.Revealer = new Gtk.Revealer();
        _search_button_revealer:Gtk.Revealer = new Gtk.Revealer();
        _search_entry_revealer.transition_type = Gtk.RevealerTransitionType.SLIDE_LEFT;
        _search_button_revealer.transition_type = Gtk.RevealerTransitionType.SLIDE_LEFT;

        _search_button:Gtk.Button = new Gtk.Button.from_icon_name ("edit-find-symbolic", Gtk.IconSize.LARGE_TOOLBAR)
        _search_button.has_tooltip = true
        _search_button.tooltip_text = "Search your current notebook"
        _search_button.clicked.connect(show_search)

        _search_button_revealer.add(_search_button)
        _search_entry_revealer.add(_search_entry)
        _search_entry_revealer.reveal_child = false
        _search_button_revealer.reveal_child = true

        // Add everything to the toolbar
        headerbar.pack_start (save_button)
        headerbar.pack_start (open_button)
        headerbar.pack_start (new_button)
        search_box.add (_search_button_revealer)
        search_box.add (_search_entry_revealer)
        headerbar.pack_end (search_box)

        show_all ()
        this.set_titlebar(headerbar)

        // Box:
        box:Gtk.Box = new Gtk.Box (Gtk.Orientation.VERTICAL, 1)
        this.add (box)

        // A ScrolledWindow:
        scrolled:Gtk.ScrolledWindow = new Gtk.ScrolledWindow (null, null)
        box.pack_start (scrolled, true, true, 0)

        // The TextView:
        _view = new Gtk.TextView ()
        _view.set_wrap_mode (Gtk.WrapMode.WORD)
        _view.buffer.text = "Lorem Ipsum"
        scrolled.add (_view)


    def show_search()
        _search_button_revealer.reveal_child = false
        _search_entry_revealer.reveal_child = true
        show_all()
        _search_visible = true
        _search_entry.can_focus = true
        _search_entry.grab_focus()

проблема

Мой подход состоял в том, чтобы создать небольшую функцию (show_search), чтобы реализовать раскрытие / сокрытие поисковой записи. Программа компилируется нормально, но я получаю ошибки во время выполнения:

(text_editor-exercise_7_1:9732): Gtk-CRITICAL **: gtk_revealer_set_reveal_child: assertion 'GTK_IS_REVEALER (revealer)' failed

(text_editor-exercise_7_1:9732): Gtk-CRITICAL **: gtk_revealer_set_reveal_child: assertion 'GTK_IS_REVEALER (revealer)' failed

(text_editor-exercise_7_1:9732): GLib-GObject-CRITICAL **: g_object_set: assertion 'G_IS_OBJECT (object)' failed

(text_editor-exercise_7_1:9732): Gtk-CRITICAL **: gtk_widget_grab_focus: assertion 'GTK_IS_WIDGET (widget)' failed

Это происходит, когда я нажимаю кнопку поиска. Может кто-нибудь указать мне на мою ошибку в этом коде? На что жалуется эта ошибка? GTK_IS_WIDGET утверждение не удалось?

1 ответ

Решение

Я извлек проблемную часть вашего кода:

class Application : Gtk.Window

    _search_entry_revealer:Gtk.Revealer
    _search_button_revealer:Gtk.Revealer

    construct ()
        _search_entry_revealer:Gtk.Revealer = new Gtk.Revealer();
        _search_button_revealer:Gtk.Revealer = new Gtk.Revealer();

    def show_search()
        _search_button_revealer.reveal_child = false
        _search_entry_revealer.reveal_child = true

Вы объявляете два атрибута типа Gtk.Revealer в своем классе.

Затем вы объявляете две локальные переменные типа Gtk.Revealer в своем методе построения.

Поэтому атрибуты никогда не устанавливаются на какое-либо значение.

Доступ к атрибутам затем выдает ошибки, которые вы получаете.

Решение простое: вы должны оставить тип вне присваиваний в методе конструкции, чтобы не объявлять локальные переменные, а использовать вместо этого атрибуты (как вы, вероятно, предполагали):

class Application : Gtk.Window

    _search_entry_revealer:Gtk.Revealer
    _search_button_revealer:Gtk.Revealer

    construct ()
        // No type annotation here, so no local variables are declared
        _search_entry_revealer = new Gtk.Revealer();
        _search_button_revealer = new Gtk.Revealer();

    def show_search()
        _search_button_revealer.reveal_child = false
        _search_entry_revealer.reveal_child = true
Другие вопросы по тегам