正在尝试编码。 C、Linux。用户输入一些字符串和日期。如果是今天,那么程序应该显示一个带有他的字符串的窗口。那么这个窗口应该由代码关闭,而不是用户。然后它会在很短的时间后再次弹出。 gtk_widget_destroy 和 gtk_widget_hide 不起作用。
`(aa:26429): Gtk-CRITICAL **: IA__gtk_widget_hide: assertion 'GTK_IS_WIDGET (widget)' failed`
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
/* numbered markers placed below by msw for reference */
char str[50];
int main( int argc, char *argv[] )
{
printf("Enter your string\n>:");
fgets( str, 50, stdin );
char time_buf[10], date[10];
int a=strlen(time_buf);
int i=0;
time_t endwait;
time_t start = time(NULL);
time_t seconds = 30;
endwait=start+seconds;
printf("Enter date\n>:");
fgets(date, 10, stdin);
time_t now;
time(&now);
strftime(time_buf, 21, "%Y-%m-%d", gmtime(&now));
if (strncmp(time_buf,date,9) == 0) {
printf("TODAY!\n");
while (start < endwait) {
GtkWidget *label;
GtkWidget *window;
gtk_init( &argc, &argv );
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_window_set_title( GTK_WINDOW( window ),"ALARM");
label = gtk_label_new( str );
gtk_container_set_border_width(GTK_CONTAINER(window), 50);
gtk_container_add( GTK_CONTAINER( window ), label );
gtk_widget_show_all( window );
g_signal_connect(G_OBJECT(window),"destroy",
G_CALLBACK( gtk_main_quit ),NULL)
gtk_main(); // mark 1 ###
gtk_widget_destroy (label); // mark 2 ###
//gtk_widget_hide(window);
start = time(NULL);
sleep(10);
}
} else {
printf("NOT TODAY");
return 0;
}
}
最佳答案
GTK 有一个 event loop , 开始于 gtk_main .实际上,它正在包装一个 glib event loop ,您可以使用 g_timeout_add_full 添加超时(或简称为 g_timeout_add )。这是处理您的问题的好方法(让一些 GTK 信号处理程序注册 Glib 超时,例如调用 gtk_widget_hide
或 gtk_exit
...)
关于Linux、C、Gtk。一段时间后关闭窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827407/