c - GTK3 - 单选按钮 : callback is called twice every time toggle the button

标签 c callback radio-button gtk3

我正在尝试按照下面的图例使用 gtk3 单选按钮。问题是我注意到每次单击按钮时回调函数都会被调用两次。 我的问题是为什么以及如何更改此设置,以便在单击单选按钮时调用一次回调?

https://developer.gnome.org/gnome-devel-demos/stable/radiobutton.c.html.en

#include <gtk/gtk.h>

static void foo(GtkWidget *widget, gpointer data)
{
    char *id_radio = (char*)data;
    g_print("%s\n", id_radio);
}

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

    GtkWidget *radio_1, *radio_2, *radio_3, *vbox, *window;

    radio_1 = gtk_radio_button_new_with_label(NULL, "Radio 01");
    radio_2 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_1), "Radio 02");
    radio_3 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio_1), "Radio 03");
    vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);                      
    g_signal_connect(GTK_TOGGLE_BUTTON(radio_1), "toggled", G_CALLBACK(foo), (gpointer)"1");
    g_signal_connect(GTK_TOGGLE_BUTTON(radio_2), "toggled", G_CALLBACK(foo), (gpointer)"2");
    g_signal_connect(GTK_TOGGLE_BUTTON(radio_3), "toggled", G_CALLBACK(foo), (gpointer)"3");

    gtk_box_pack_start(GTK_BOX(vbox), radio_1, 1, 1, 0);
    gtk_box_pack_start(GTK_BOX(vbox), radio_2, 1, 1, 0);
    gtk_box_pack_start(GTK_BOX(vbox), radio_3, 1, 1, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    gtk_widget_show_all(window);
    gtk_main();
    return 0;
}

最佳答案

从切换按钮继承的“切换”信号在停用和激活时都会触发。当您选择一个单选按钮时,先前选择的按钮将被停用(第一个回调),而新按下的按钮将被激活(第二个回调)。

如果您只想过滤掉激活,请使用 gtk_toggle_button_get_active () 在回调中获取切换按钮的状态。

根据文档:

https://developer.gnome.org/gtk3/stable/GtkToggleButton.html#gtk-toggle-button-get-active

关于c - GTK3 - 单选按钮 : callback is called twice every time toggle the button,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59913986/

相关文章:

css - 使用 css 检查单选按钮时影响 div

c# - 使用枚举作为值识别选中哪个单选按钮

javascript - 使用 jQuery 捕获当前(不是之前)选择的单选按钮的值

c - (Kali & Ettercap) 插件编译错误

c++ - gcc: undefined reference 错误

javascript - 如何将回调作为变量传递给预定义的回调

回调中的 Java RMI 超时

c - 带有 int 指针的可变参数列表,未按预期工作

java - JNI 将 String 转换为 char *,由实例方法返回

javascript - 如何从延迟返回值?