关闭GTK窗口

Close a GTK Window

本文关键字:窗口 GTK 关闭      更新时间:2023-10-16

请耐心等待,因为我是GTK和GDK的新手。

我正在尝试循环浏览几个图像,对它们进行修改(在不同的点上画一个圆圈),并从stdin获取用户输入。

我编写了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(小部件)"失败

所以我要回答我自己的问题。也许还有更好的方法,我很想听到,但这就是我解决问题的方法

我使用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);
}

它似乎运行得很好。