如何在GTK3控件中显示矩阵维度变量d和e的数值?
解决GTK控件中显示矩阵维度变量的问题
要实现将变量d和e的数值显示在控件中,你需要做以下几个关键修改:
1. 新增用于显示维度的全局标签变量
把显示维度的GtkWidget标签设为全局,这样点击事件函数可以直接访问并更新它。
2. 修复字符串比较的错误
C语言中不能直接用==比较字符串,必须用strcmp()函数,否则你的按钮逻辑可能不会正确触发。
3. 在按钮点击事件中更新标签文本
每次修改d或e后,格式化新的字符串并调用gtk_label_set_text()更新标签内容。
修改后的完整代码
#include <stdlib.h> #include <gtk/gtk.h> #include <string.h> // 引入strcmp所需的头文件 static int d = 0, e = 0; // 初始化变量,避免未定义行为 static GtkWidget *dim_label; // 全局标签,用于显示维度 void on_button_click(GtkWidget *widget, gpointer data) { if (strcmp((char *)data, "1") == 0) d = d + 1; if (strcmp((char *)data, "2") == 0) d = d - 1; if (strcmp((char *)data, "3") == 0) e = e + 1; if (strcmp((char *)data, "4") == 0) e = e - 1; // 格式化维度字符串并更新标签 char dim_text[50]; snprintf(dim_text, sizeof(dim_text), "Columns x: %d\nRows y: %d", d, e); gtk_label_set_text(GTK_LABEL(dim_label), dim_text); g_print("The dimension is height: %d y width : %d\n", d, e); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; GtkWidget *table; GtkWidget *label; GtkWidget *frame; gtk_init(&argc, &argv); // 修正原代码的语法错误 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Start ..."); gtk_container_set_border_width(GTK_CONTAINER(window), 10); table = gtk_table_new(3,4,FALSE); gtk_container_add(GTK_CONTAINER(window), table); // 维度调节按钮 button = gtk_button_new_with_label("More x"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_click), (gpointer)"1"); gtk_table_attach(GTK_TABLE(table), button, 0,1,0,1,0,0,2,2); button = gtk_button_new_with_label("Less x"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_click), (gpointer)"2"); gtk_table_attach(GTK_TABLE(table), button, 1,2,0,1,0,0,2,2); button = gtk_button_new_with_label("More y"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_click), (gpointer)"3"); gtk_table_attach(GTK_TABLE(table), button, 2,3,0,1,0,0,2,2); button = gtk_button_new_with_label("Less y"); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_button_click), (gpointer)"4"); gtk_table_attach(GTK_TABLE(table), button, 3,4,0,1,0,0,2,2); // 修正布局参数,避免控件重叠 // 退出按钮 button = gtk_button_new_with_label("Quit"); gtk_table_attach(GTK_TABLE(table), button, 0,2,1,2,0,0,2,2); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), (gpointer)window); // 维度显示区域 frame = gtk_frame_new("Matrix Dimensions"); dim_label = gtk_label_new("Columns x: 0\nRows y: 0"); // 初始化标签文本 gtk_container_add(GTK_CONTAINER(frame), dim_label); gtk_table_attach(GTK_TABLE(table), frame, 2,4,1,2,GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL,0,0); // 提示文本 frame = gtk_frame_new(NULL); label = gtk_label_new("Redim the matrix... "); gtk_container_add(GTK_CONTAINER(frame), label); gtk_table_attach(GTK_TABLE(table), frame,0,4,2,3,GTK_EXPAND|GTK_FILL, GTK_EXPAND|GTK_FILL,0,0); gtk_widget_show_all(window); gtk_main(); return 0; }
关键修改说明
- 新增
dim_label全局变量,专门用于显示维度数值 - 用
strcmp()替代原代码中的==字符串比较,确保按钮逻辑正确触发 - 在点击事件中通过
snprintf()格式化维度文本,再调用gtk_label_set_text()更新标签内容 - 初始化
d和e的初始值为0,避免未定义行为 - 修正原代码中
gtk_init后的语法错误,以及Less y按钮的布局参数错误,解决控件重叠问题
内容的提问来源于stack exchange,提问作者Luis Federico
相关产品推荐
相关产品推荐

