首页 > 解决方案 > Gtk.Entry 无法从其他方法设置文本

问题描述

对 vala 和 Gtk 来说很新。我无法调用 Gtk.Entry 的 set_text 方法来从另一个方法设置文本。这是我尝试过的示例代码。我可以在 activate() 方法中设置文本,但不能从 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);
}

}

标签: gtk3vala

解决方案


问题是范围问题。所以在该方法的范围内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);
  }
}

你应该注意到:

  • entryGtk.Entry entry;在类定义的开头被引入整个类的范围
  • entry = new Gtk.Entry ();已被删除,因为该条目在被调用tryThis时已被实例化activate

这可行,但从长远来看,最好将窗口与应用程序分开。所以用activate实例化一个新MainApplicationWindow的例子。Vala 还包括 Gtk 模板的代码生成例程。这允许您使用 XML 或 GUI 工具Glade定义窗口及其子小部件,然后将 Vala 代码与 Vala属性[GtkTemplate]和.[GtkChild][GtkCallback]


推荐阅读