2014-11-09 169 views
0

忍受我,因为我对GTK和GDK非常陌生。关闭GTK窗口

我想通过几个图像循环,对它们进行修改(在各个点绘制一个圆圈),并从标准输入接受用户输入。

我写了C++类来包装GTK框架,所以我可以简化图像处理。我目前正在打开每个图像的个别窗口,要求输入,关闭该窗口,然后打开下一个窗口。

我可以做的一切都很好,除非让窗口关闭以编程方式,并让用户这样做是不可接受的(即太乏味)。以下是打开和关闭窗口的代码。

void PixelImage::show() { 
    gtk_widget_show_all(this->window); 
    gtk_main(); 
} 

void PixelImage::close() { 
    gtk_window_close((GtkWindow*)this->window); 
} 

PixelImage::PixelImage(const char *fname) { 
    this->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    g_signal_connect(this->window, "destroy", 
        G_CALLBACK (gtk_main_quit), NULL); 

    this->fname = std::string(fname); 
    this->image = gtk_image_new_from_file(fname); 
    this->pix = gtk_image_get_pixbuf((GtkImage*)this->image); 
    this->pixels = gdk_pixbuf_get_pixels(this->pix); 
    this->len = gdk_pixbuf_get_byte_length(this->pix); 

    this->width = gdk_pixbuf_get_width(this->pix); 
    this->height = gdk_pixbuf_get_height(this->pix); 
    this->nchannels = gdk_pixbuf_get_n_channels(this->pix); 
    this->rowstride = gdk_pixbuf_get_rowstride(this->pix); 

    gtk_container_add(GTK_CONTAINER (this->window), this->image); 
} 

当显示后调用close时,窗口将保留,当我关闭它时会出现以下错误。

(IMG:2173):GTK的CRITICAL **:gtk_widget_get_realized:断言 'GTK_IS_WIDGET(插件)' 失败

回答

0

所以我会回答我的问题。也许有更好的方法,我很乐意听到,但这是我解决它的方法。

我用POSIX线程打开一个线程,打开图像窗口,然后在主线程上做其他事情。然后我简单地从主线程调用gtk_main_quit()。然后我加入窗户轴承螺纹。这是代码。

static void* gtkStarter(void * a) { 
    gtk_main(); 
    return NULL; 
} 

void PixelImage::show() { 
    gtk_widget_show_all(this->window); 
    pthread_create(&this->pp, NULL, gtkStarter, NULL); 
} 

void PixelImage::close() { 
    gtk_main_quit(); 
    pthread_join(this->pp, NULL); 
} 

它似乎工作得很好。