Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gtk 单击按钮后添加元素_Gtk_Gtk3_Vala_Gnome Builder - Fatal编程技术网

Gtk 单击按钮后添加元素

Gtk 单击按钮后添加元素,gtk,gtk3,vala,gnome-builder,Gtk,Gtk3,Vala,Gnome Builder,我试图通过编写一个非常简单的应用程序来学习Vala,但我遇到了一个自己无法解决的问题 该程序只显示一个按钮Init,单击该按钮应向网格容器添加一个按钮X。不幸的是,网格容器的内容仍然是空的,我不知道为什么 更令人困惑的是,在构造函数中添加正确的按钮可以按预期工作 我做错了什么 using Gtk; class MyWindow: Gtk.Window { private Gtk.Grid mGrid; public MyWindow() { var init=

我试图通过编写一个非常简单的应用程序来学习Vala,但我遇到了一个自己无法解决的问题

该程序只显示一个按钮
Init
,单击该按钮应向网格容器添加一个按钮
X
。不幸的是,网格容器的内容仍然是空的,我不知道为什么

更令人困惑的是,在构造函数中添加正确的按钮可以按预期工作

我做错了什么

using Gtk;

class MyWindow: Gtk.Window {
    private Gtk.Grid mGrid;

    public MyWindow() {
        var init=new Gtk.Button.with_label("Init");
        init.clicked.connect((t)=>{
            stdout.printf("Init");
            mGrid.attach(new Gtk.Button.with_label("X"),0,0,1,1);
        });
        var box=new Gtk.Box(VERTICAL,0);
        mGrid=new Gtk.Grid();
        //mGrid.attach(new Gtk.Button.with_label("X"),0,0,1,1);
        box.add(init);
        box.add(mGrid);
        this.add(box);
        this.show_all();
    }
}

int main(string[] args) {
    Gtk.init(ref args);
    new MyWindow();
    Gtk.main();
    return 0;
}

对于GTK+工具包,默认情况下小部件是隐藏的。尽管您有
this.show_all()
,但该按钮随后创建并隐藏。将回调更改为:

init.clicked.connect((t)=>{
  stdout.printf("Init");
  mGrid.attach(new Gtk.Button.with_label("X"),0,0,1,1);
});
例如:

init.clicked.connect((t)=>{
  stdout.printf("Init");
  var my_button = new Gtk.Button.with_label("X");
  my_button.show_all ();
  mGrid.attach(my_button,0,0,1,1);
});
现在可以工作了。

注意Gtk4中的情况会有所不同