第54页的gtk+编程例子——选择按钮

这篇博客介绍了如何使用GTK+在Linux环境中创建一个图形用户界面,该界面包含多个Radio Button,用于选择不同的桌面环境(如KDE、GNOME、XFCE和IceWM)。通过示例代码展示了两种实现方式,一种直接设置每个Radio Button的组,另一种使用GSList获取并设置组。最终展示了编译和运行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要是参考博文:https://blog.youkuaiyun.com/weixin_44374594/article/details/117813316

以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第54页的内容——选择按钮
在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc page54.c -o page54 pkg-config --cflags --libs gtk±3.0
ruhong@localhost:~/gtk> ./page54

/* the example on page 54 */

#include <gtk/gtk.h>
gint Delete (GtkWidget *widget, gpointer gdata)
{
	gtk_main_quit ();
	return (FALSE);
}

int main( int argc, char *argv[] )
{
	GtkWidget *window;
	GtkWidget *box;
	GtkWidget *label;
	GtkWidget *radio_button_kde;
	GtkWidget *radio_button_gnome;
	GtkWidget *radio_button_xfce;
	GtkWidget *radio_button_icewm;
	
	gtk_init (&argc, &argv);

	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title (GTK_WINDOW (window), "radio_button");
	g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (Delete), NULL);
	gtk_container_set_border_width (GTK_CONTAINER (window), 100);

	box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);

	label = gtk_label_new ("Linux桌面选择,只能选择一个");
	gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
	gtk_widget_show (label);

	radio_button_kde = gtk_radio_button_new_with_label (NULL, "KDE");
	gtk_box_pack_start (GTK_BOX(box), radio_button_kde, FALSE, FALSE, 0);
	gtk_widget_show (radio_button_kde);

	radio_button_gnome = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radio_button_kde), "GNOME");
	gtk_box_pack_start (GTK_BOX(box), radio_button_gnome, FALSE, FALSE, 0);
	gtk_widget_show (radio_button_gnome);
	
	radio_button_xfce = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radio_button_kde), "xfce");
	gtk_box_pack_start (GTK_BOX(box), radio_button_xfce, FALSE, FALSE, 0);
	gtk_widget_show (radio_button_xfce);

	radio_button_icewm = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON(radio_button_kde), "IceWM");
	gtk_box_pack_start (GTK_BOX(box), radio_button_icewm, FALSE, FALSE, 0);
	gtk_widget_show (radio_button_icewm);

	gtk_container_add (GTK_CONTAINER(window), box);
	gtk_widget_show (box);
	gtk_widget_show (window);
	gtk_main ();
	return 0;
}

其实原书中的写法,就是使用GSList和gtk_radio_button_get_group实现的,每个新建按钮都使用group值,并且每次使用gtk_radio_button_get_group将group值设置与第一个按钮radio_button_kde的group的值一样

/* the example on page 542 */

#include <gtk/gtk.h>
gint Delete (GtkWidget *widget, gpointer gdata)
{
	gtk_main_quit ();
	return (FALSE);
}

int main( int argc, char *argv[] )
{
	GtkWidget *window;
	GtkWidget *box;
	GtkWidget *label;
	GtkWidget *radio_button_kde;
	GtkWidget *radio_button_gnome;
	GtkWidget *radio_button_xfce;
	GtkWidget *radio_button_icewm;
	GSList *group = NULL;
	
	gtk_init (&argc, &argv);

	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title (GTK_WINDOW (window), "radio_button");
	g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (Delete), NULL);
	gtk_container_set_border_width (GTK_CONTAINER (window), 100);

	box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);

	label = gtk_label_new ("Linux桌面选择,只能选择一个");
	gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
	gtk_widget_show (label);

	radio_button_kde = gtk_radio_button_new_with_label (group, "KDE");
	gtk_box_pack_start (GTK_BOX(box), radio_button_kde, FALSE, FALSE, 0);
	gtk_widget_show (radio_button_kde);
	group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button_kde));

	radio_button_gnome = gtk_radio_button_new_with_label (group, "GNOME");
	gtk_box_pack_start (GTK_BOX(box), radio_button_gnome, FALSE, FALSE, 0);
	gtk_widget_show (radio_button_gnome);
	group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button_kde));
	
	radio_button_xfce = gtk_radio_button_new_with_label (group, "xfce");
	gtk_box_pack_start (GTK_BOX(box), radio_button_xfce, FALSE, FALSE, 0);
	gtk_widget_show (radio_button_xfce);
	group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button_kde));

	radio_button_icewm = gtk_radio_button_new_with_label (group, "IceWM");
	gtk_box_pack_start (GTK_BOX(box), radio_button_icewm, FALSE, FALSE, 0);
	gtk_widget_show (radio_button_icewm);
	group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button_kde));

	gtk_container_add (GTK_CONTAINER(window), box);
	gtk_widget_show (box);
	gtk_widget_show (window);
	gtk_main ();
	return 0;
}

效果图如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值