gtk3 - 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);
}
}
解决方案
问题是范围问题。所以在该方法的范围内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]
推荐阅读
- css - 如何在 Scrapy 中将 CSS 选择器转换为 XPath?
- vim - vim,键入 + 寄存器会导致奇怪的行为
- winapi - VERTRES 和 HORZRES 取决于系统启动时的缩放设置
- c++ - 如何在 C++ 中将多个子类的对象存储在向量中
- c - C - 将密钥从 kbhit 写入文件会使程序崩溃
- c# - Url.IsLocalUrl 产生具有相同值的不同结果?
- angular - 如何删除 DOM 元素或将其从组件中清空
- c# - Microsoft Graph:如何为新用户关闭“在全局地址列表中显示”
- java - 确定 URI 是否有效并使其成为 Android for Images 上的有效文件
- asp.net-mvc - 不知道这样的主机。(使用 HttpClient 从 webapi 控制器调用 weatherAPI)