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分ほどで終了。
結構効率化できますね。
(五目並べの中身は後日実装予定)
いいなと思ったら応援しよう!
よろしければサポートお願いいたします。
現在無職なので、多少のサポートでも助かります。