2017-12-01 4 views
2

時間を表示するアプリケーションを作成したい(最終的には、既存のスマートミラーAPIを使用せずに自分のシンプルなスマートミラーをハックしようとしています)。私はUI用にGTK3を使用していますが、UIアップデートを行うための解決策を見つけ出すのに問題があります(私はフロントエンドやGTKの経験がありません)。GTKのインタフェースを更新する

私は、以下に示すview3コードの一部の周りにループを配置しようとしましたが、gtk_main()が呼び出されるとgtkメインループから出ることができないので、whileループが開始され、私が書いた機能。

私はgtk_main_iteration_do(gtk_false())のような関数を使用しようとしましたが(ブロックされないようにfalse)、これらの関数については十分理解していません。ループからgtk_main()を離しておくと、明らかにgtk_main()は呼び出されず、アプリケーションウィンドウも開かれません。

私が書いたget_time_string()関数の定義の下で、以下のmainに関連するコードを示しました。 get_time_stringの

int 
main (int argc, 
     char *argv[]) 
{ 
    // initialization and setting up window, packing widgets, etc 

    // view3 
    // populate buffer with time string 
    // and insert into text view 
    view3 = gtk_text_view_new(); 
    gtk_widget_set_name(view3, "view3"); 
    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view3)); 
    gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); 
    gtk_text_buffer_insert(buffer, &iter, get_time_string(), -1); 
    gtk_text_view_set_editable(GTK_TEXT_VIEW(view3), FALSE); 
    gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view3), FALSE); 


    // More widget packing, setting up UI 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

定義()

char* get_time_string(){ 
    time_t time_var = time(NULL); 
    struct tm *info; 
    char *time_string = calloc(100, sizeof(char)); 
    info = localtime(&time_var); 
    strftime(time_string, 100, "%I:%M %p", info); 
    return time_string; 
} 

答えて

1

は、あなたが本当に必要としない限り、メインループの繰り返しで遊ぶか、何をすべきかを知っているべきではありません。

トリックは、g_timeout_addまたはg_idle_addとその変形を使用することです。一定の間隔で更新する時間が必要な場合(分の解像度では60秒ごとに更新されます)、g_timeout_add_secondsを使用できます。説明の目的のために

、私はあなたの時間文字列に秒を追加し、毎秒更新し、あなたのget_time_string機能を使用して、ただの時間ラベルを表示するための非常にシンプルなウィンドウ作成されます:結果をする必要があり

#include <time.h> 
#include <stdlib.h> 
#include <gtk/gtk.h> 

char* get_time_string(){ 
    time_t time_var = time(NULL); 
    struct tm *info; 
    char *time_string = calloc(100, sizeof(char)); 
    info = localtime(&time_var); 
    strftime(time_string, 100, "%I:%M:%S %p", info); 
    return time_string; 
} 

gboolean update_label_time (gpointer user_data) { 
    gchar *t = get_time_string(); 
    gtk_label_set_text(GTK_LABEL(user_data), t); 
    g_free (t); 
    return G_SOURCE_CONTINUE; 
} 

int main (int argc, char *argv[]) 
{ 
    gchar *t; 
    GtkWidget *window; 
    GtkWidget *label_time; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_default_size (GTK_WINDOW(window), 300, 200); 
    t = get_time_string(); 
    label_time = gtk_label_new (t); 
    g_free (t); 

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); 
    gtk_container_add (GTK_CONTAINER(window), label_time); 


    g_timeout_add_seconds(0.5, update_label_time, label_time); 


    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 

を秒ごとに更新するラベルを持つウィンドウこと:

enter image description here

GLibのは、あなたが使うべきtime functions独自のを持っています。

+0

HeyJosé、あなたは 'get_time_string'で割り当てられた文字列のメモリを漏らしています。もう一つの問題は、 'g_timeout_add_seconds'は本当に正確ではなく、ドキュメンテーションは' 'タイマーの最初の呼び出しが1秒のタイムアウトに対して正確ではないことに注意してください。したがって、500msのサンプリングを伴う 'g_timeout_add'は同じ時間が例えば2秒間表示されるのを避けるべきです。 – liberforce

+0

@libforceあなたは正しいです、私の悪いです。フィードバックをお寄せいただきありがとうございます。ではごきげんよう! –

+1

De nada、tenhaum bom dia;) – liberforce

関連する問題