Linux、C、Gtk。一段时间后关闭窗口

标签 linux gtk

正在尝试编码。 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_hidegtk_exit ...)

关于Linux、C、Gtk。一段时间后关闭窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827407/

相关文章:

linux - 如果服务器在我登录时打印字符串,如何在 MobaXterm 中打开 sftp 面板?

c++ - 通过 GdkPixbuf 绘图绘制在错误的像素坐标

python - 如何在 VScode 和 PyCharm 等 PyGtk 应用程序中实现 Linux 终端?

linux - 如何为 Ubuntu 创建登录屏幕替代品

python - 如何控制 GTK 行间文本间距

python - 哪个 Linux 发行版默认附带 python 2.6?

linux - rsync 仅某些类型的文件

linux - CloudLinux 将用户访问到 root

c - 在不安装的情况下构建嵌套的 Autotools 包

c++ - 如何将 gtk::label 与目录中文件的创建或抑制同步?