Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Radio button 如何使Gtk.ToggleToolButton的行为类似于单选按钮?_Radio Button_Gtk_Vala - Fatal编程技术网

Radio button 如何使Gtk.ToggleToolButton的行为类似于单选按钮?

Radio button 如何使Gtk.ToggleToolButton的行为类似于单选按钮?,radio-button,gtk,vala,Radio Button,Gtk,Vala,我正在编写一个Vala应用程序,并在其中使用Gtk.ToggleToolButtons。我希望它们像单选按钮一样工作,例如,当单击其中一个按钮时,其他按钮应设置为非活动状态。问题是,我不知道怎么做 我试着这样做: public void uncheckButtonsExcept(string notUncheck) { feedButton.active = (notUncheck == "feed"); userButton.active = (notUnche

我正在编写一个Vala应用程序,并在其中使用Gtk.ToggleToolButtons。我希望它们像单选按钮一样工作,例如,当单击其中一个按钮时,其他按钮应设置为非活动状态。问题是,我不知道怎么做

我试着这样做:

public void uncheckButtonsExcept(string notUncheck)
{
        feedButton.active = (notUncheck == "feed");
        userButton.active = (notUncheck == "self");
        photoButton.active = (notUncheck == "photo");
        searchButton.active = (notUncheck == "search");
        newsButton.active = (notUncheck == "news");
}
该函数在每个按钮的
单击的
回调中运行,如下所示:

    searchButton.clicked.connect(() => {
        uncheckButtonsExcept("search");
    });
public void uncheckButtonsExcept(string notUncheck)
{
    Idle.add(() => {
        feedButton.active = (notUncheck == "feed");
        userButton.active = (notUncheck == "self");
        photoButton.active = (notUncheck == "photo");
        searchButton.active = (notUncheck == "search");
        newsButton.active = (notUncheck == "news");
        return false;
    });
}
但是,当我单击按钮时,程序会出错

我试图将我的所有函数包装到Idle.add()
(因为我的程序在重新绘制不在主线程中的小部件后出现故障时已经遇到了问题),如下所示:

    searchButton.clicked.connect(() => {
        uncheckButtonsExcept("search");
    });
public void uncheckButtonsExcept(string notUncheck)
{
    Idle.add(() => {
        feedButton.active = (notUncheck == "feed");
        userButton.active = (notUncheck == "self");
        photoButton.active = (notUncheck == "photo");
        searchButton.active = (notUncheck == "search");
        newsButton.active = (notUncheck == "news");
        return false;
    });
}
在这之后,我的程序不再出错,而是冻结

我试图使用
set\u active()
,但它也激活了
toggled()
信号,我不想这样做


那么,问题是:如何在不激活
单击的
回调的情况下设置按钮状态

我知道了。单击的
信号只有在按钮的状态发生变化时才起作用,这意味着在我的情况下,它起了两次作用:单击的按钮和未触动的按钮。这就产生了一个无限循环:我有两个按钮,我点击第一个按钮,然后点击第二个按钮。第一个单击的
事件将被触发(其状态已更改),并设置为活动。现在触发第二个单击的
事件,依此类推。这不是我想要的

我已经像这样给每个人的“clicked”函数添加了一个检查,现在它的工作方式应该是这样的

    feedButton.toggled.connect(() => {
        if (!feedButton.get_active())
            return;
        uncheckButtonsExcept("feed");
    });

为什么不想激活
切换
信号?@ace,因为它会在我两次单击按钮时(当我实际单击它时,以及当我更改
活动
状态时)做出反应(这不是我想做的)。为什么不加入一些条件,这样代码只有在选中时才会执行?例如,是否检查了按钮;然后取消选中其他按钮;在您的取消选中功能中:如果按钮已选中,则取消选中!=“饲料”;然后将_设置为活动(false);(对不起,我不认识Vala,无法给出语法上有效的示例)@ace您的评论给了我解决问题的方法: