Gtk.Entry не удалось установить set_text из другого метода - PullRequest
0 голосов
/ 27 ноября 2018

Довольно плохо знаком с Вала и Гтк.Я не могу вызвать метод set_text Gtk.Entry, чтобы установить текст из другого метода.Вот пример кода, который я пробовал.Я могу установить set_text в методе activ (), но только не из метода tryThis ().

using Gtk;
public class MyApplication : Gtk.Application {

public MyApplication () {
    Object(application_id: "testing.my.application",
    flags: ApplicationFlags.FLAGS_NONE);
}

protected override void activate () {

    Gtk.ApplicationWindow window = new Gtk.ApplicationWindow (this);
    window.set_default_size (800, 600);
    window.window_position = WindowPosition.CENTER;
    window.set_border_width(10);

    Gtk.HeaderBar headerbar = new Gtk.HeaderBar();
    headerbar.show_close_button = true;
    headerbar.title = "Window";
    window.set_titlebar(headerbar);

    //Entry is initialized here
    Gtk.Entry entry = new Gtk.Entry();
    entry.set_text ("Before button click");

    //Button is initialized and connect to method
    Gtk.Button but = new Gtk.Button.with_label("Click me");
    but.clicked.connect(tryThis);

    Gtk.Box vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
    vbox.pack_start(entry, false, false, 10);
    vbox.pack_start(but, false, false, 20);

    window.add(vbox);
    window.show_all ();
}

private void tryThis() {
    Gtk.Entry entry = new Gtk.Entry();
    //This is not working!!
    entry.set_text ("After button click");
    message("%s -", "I am here");
}

public static int main (string[] args) {
    MyApplication app = new MyApplication ();
    return app.run (args);
}

}

1 Ответ

0 голосов
/ 27 ноября 2018

Проблема - это проблема охвата.Таким образом, activate создает entry в рамках этого метода, а не весь класс.tryThis создает новый экземпляр Gtk.Entry и присваивает его переменной entry в области действия этого метода, а не всему классу.

Этот пример решает вашу проблему, но не является лучшим решением, как обсуждалось после примера:

using Gtk;

public class MyApplication : Gtk.Application {

  Gtk.Entry entry;

  public MyApplication () {
    Object(application_id: "testing.my.application",
    flags: ApplicationFlags.FLAGS_NONE);
  }

  protected override void activate () {

  Gtk.ApplicationWindow window = new Gtk.ApplicationWindow (this);
  window.set_default_size (800, 600);
  window.window_position = WindowPosition.CENTER;
  window.set_border_width(10);

  Gtk.HeaderBar headerbar = new Gtk.HeaderBar();
  headerbar.show_close_button = true;
  headerbar.title = "Window";
  window.set_titlebar(headerbar);

  //Entry is initialized here
  entry = new Gtk.Entry();
  entry.set_text ("Before button click");

  //Button is initialized and connect to method
  Gtk.Button but = new Gtk.Button.with_label("Click me");
  but.clicked.connect(tryThis);

  Gtk.Box vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
  vbox.pack_start(entry, false, false, 10);
  vbox.pack_start(but, false, false, 20);

  window.add(vbox);
  window.show_all ();
  }

  private void tryThis() {
    entry.set_text ("After button click");
    message("%s -", "I am here");
  }

  public static int main (string[] args) {
    MyApplication app = new MyApplication ();
    return app.run (args);
  }
}

Вы должны заметить, что:

  • entry вводится в область видимости всего класса с Gtk.Entry entry; в началеопределения класса
  • entry = new Gtk.Entry (); был удален из tryThis, потому что запись уже была создана, когда activate вызывается

Это работает, но на более длительный сроклучше отделить окно от приложения.Так что используйте activate, например, для создания нового MainApplicationWindow.Также Vala включает процедуры генерации кода для шаблонов Gtk.Это позволяет вам определять окно и его дочерние виджеты, используя XML или инструмент GUI Glade , а затем присоединять код Vala с атрибутами Vala [GtkTemplate], [GtkChild] и [GtkCallback].

...