You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:01:23