Проблема - это проблема охвата.Таким образом, 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]
.