2014-09-13 2 views
0

코드를 작성하려고했습니다. C, 리눅스. 사용자가 문자열과 날짜를 입력하십시오. 오늘이라면 프로그램은 그의 문자열이있는 창을 보여줘야합니다. 이 창은 사용자가 아닌 코드로 닫아야합니다. 그런 다음 짧은 시간 후에 다시 팝업됩니다. gtk_widget_destroy 및 gtk_widget_hide가 작동하지 않습니다.Linux, C, Gtk. 잠시 후 창 닫기

`(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; 
    } 
} 
+0

더 나은 형식으로 질문을 편집하십시오. 코드 및 오류 메시지는 4 개의 공백으로 시작해야합니다. –

답변

1

큰 문제는 당신이 마크 1에 gtk_main()를 호출 한 후, 프로그램이하는 것을입니다 gtk_main이 종료 될 때까지 다시 실행되지 않습니다. gtk_main을 반환하기 전에 맨 위 아래의 모든 위젯이 삭제됩니다. 그래서 내가 이미 파괴 된 라벨을 파괴하려고 시도하는 2 번 마크에서 오류가 발생했다고 가정합니다.

왜 내가 행동을 원하는지 아직 나에게 명확하지 않습니다. screen-wide popup notification은 gtk/glib/X11 프로그램과 다르기 때문에 다르게 동작합니다. 프로그램을 실행 중이고 최상위 창이 화면에 나타나면 그 원인을 알아야하고이를 제거 할 수 있어야합니다. 팝업을 스크랩하고 항목 ¹ 아래에 라벨을 붙이고 보이지 않게하려면 텍스트를 ""로 변경하는 것이 사용자에게 더 직관적입니다. 그리고 @BasileStarynkevitch가 말한 것.

¹ 항목이 무엇입니까? 문자열을 입력해야하는 것입니다. 콘솔에서 입력을 받아 창에 출력을 표시하는 이상한 프로그램이 될 것입니다.

1

GTK는 gtk_main으로 시작하여 event loop입니다. 실제로 glib event loop을 랩핑하고 있으며 g_timeout_add_full (또는 간단히 g_timeout_add)을 사용하여 시간 초과를 추가 할 수 있습니다. 이 문제를 처리 할 수있는 좋은 방법 (일부 GTK 신호 처리기가 gtk_widget_hide 또는 gtk_exit 전화 예 수있는 입심 타임 아웃을 등록 할 수 있도록 ...)