見出し画像

C言語とgtk4を使うプログラムをchatGPTと相談してみた

五目並べのUbuntu用アプリを作りたいのですが、GUIの実装がわからない。

なので、とりあえずC言語とgtk4を使って、8×8の盤面をボタンで実装し、そのボタンにpng形式の画像を貼る方法を教えてもらいました。

まず出てきたのがこれ

#include <gtk/gtk.h>

// グリッドサイズ
#define GRID_SIZE 8

// ボタンがクリックされたときの処理
void on_button_clicked(GtkButton *button, gpointer user_data) {
    static gboolean toggle = FALSE;
    const char *image_path = toggle ? "path/to/image1.png" : "path/to/image2.png";
    toggle = !toggle;

    // ボタンに新しい画像を設定
    GtkWidget *image = gtk_image_new_from_file(image_path);
    gtk_button_set_child(button, image);
}

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);

    // メインウィンドウの作成
    GtkWidget *window = gtk_window_new();
    gtk_window_set_title(GTK_WINDOW(window), "GTK4 Grid Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);

    // グリッドの作成
    GtkWidget *grid = gtk_grid_new();
    gtk_window_set_child(GTK_WINDOW(window), grid);

    // ボタンをグリッドに配置
    for (int i = 0; i < GRID_SIZE; i++) {
        for (int j = 0; j < GRID_SIZE; j++) {
            GtkWidget *button = gtk_button_new();
            GtkWidget *image = gtk_image_new_from_file("path/to/image1.png");
            gtk_button_set_child(GTK_BUTTON(button), image);

            // クリックイベントの接続
            g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), NULL);

            // グリッドにボタンを追加
            gtk_grid_attach(GTK_GRID(grid), button, j, i, 1, 1);
        }
    }

    // ウィンドウを表示
    gtk_widget_show(window);

    gtk_main();
    return 0;
}


ほうほう、素晴らしいと思ってそのままコンパイルするとエラーをはく。

次に、エラーをはかない方法を聞いてみた。
結果が次のコードです。

#include <gtk/gtk.h>

static void on_activate(GtkApplication *app, gpointer user_data) {
    GtkWidget *window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "GTK4 Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);
    gtk_widget_show(window);
}

int main(int argc, char *argv[]) {
    GtkApplication *app = gtk_application_new("com.example.gtkapp", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);

    int status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);
    return status;
}


え、えと?
盤面出せないよ、と思って質問繰り返そうとしたら、chatGPT君、黙っちゃいました。
自力でどうにかしたのがこれ。

#include <gtk/gtk.h>

// グリッドサイズ
#define GRID_SIZE 8

// ボタンがクリックされたときの処理
void on_button_clicked(GtkButton *button, gpointer user_data) {
    static gboolean toggle = FALSE;
    const char *image_path = toggle ? "./image1.png" : "./image2.png";
    toggle = !toggle;

    // ボタンに新しい画像を設定
    GtkWidget *image = gtk_image_new_from_file(image_path);
    gtk_button_set_child(button, image);
}

static void on_activate(GtkApplication *app, gpointer user_data) {
    GtkWidget *window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "GTK4 Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);
    GtkWidget *grid = gtk_grid_new();
    gtk_window_set_child(GTK_WINDOW(window), grid);

    for (int i = 0; i < GRID_SIZE; i++) {
        for (int j = 0; j < GRID_SIZE; j++) {
            GtkWidget *button = gtk_button_new();
            GtkWidget *image = gtk_image_new_from_file("path/to/image1.png");
            gtk_button_set_child(GTK_BUTTON(button), image);

            // クリックイベントの接続
            g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), NULL);

            // グリッドにボタンを追加
            gtk_grid_attach(GTK_GRID(grid), button, j, i, 1, 1);
        }
    }

    gtk_widget_show(window);
}

int main(int argc, char *argv[]) {
    GtkApplication *app = gtk_application_new("com.example.gtkapp", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);

    int status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);
    return status;
}



gcc -o grid_app grid_app.c `pkg-config --cflags --libs gtk4`

./grid_app

ソースファイル名がgrid_app.c、コンパイルされて生成されるアプリがgrid_appです(gtk4を使用するための引数も含めてコンパイルしてます)。


結構使い物になるわ。
完璧なものはすぐにできませんでしたが、数日調べてわからなかったものが、30分ほどで終了。
結構効率化できますね。
(五目並べの中身は後日実装予定)

いいなと思ったら応援しよう!

ゆきかぜ@一般社会不適合者
よろしければサポートお願いいたします。 現在無職なので、多少のサポートでも助かります。

この記事が参加している募集