第115页的gtk编程例子——进度条改写网上的例子用gtk4编译主要是参考网络《GTK 2.0 中文教程》中进度条 Progress Bars的例子程序源代码出处是http://www.huzheng.org/ebook/gtk2-tut/x892.html第115页的gtk编程例子——最简单的进度条2附带使用Anjuta写gtk程序的步骤https://blog.csdn.net/weixin_42145772/article/details/125022694在openSUSE-Leap-15.6-DVD-x86_64的gnome45.3桌面环境下编译的其中pkg-config --cflags gtk4两边有反引号括起来的ruhongvnclocalhost:~/gtk4 gcc -g -Wallpkg-config --cflags gtk4page1154.cpkg-config --libs gtk4-o page1154#includestdlib.h#includegtk/gtk.hstaticinttime_interval500;/* 定义全局变量time_interval并设定初始值为500 */staticgdouble increment0.1;staticGtkWidget*entry1;staticvoidslow(void){time_interval800;/* 改变全局变量time_interval的值为800 */}staticvoidmiddle(void){time_interval500;}staticvoidquick(void){time_interval200;}staticvoidcustom(void){constchar*text;GtkEntryBuffer*buffer;char*endptrNULL;buffergtk_entry_get_buffer(GTK_ENTRY(entry1));textgtk_entry_buffer_get_text(buffer);/* 获取用户在输入框entry1输入的数字内容例如0.08此时的数字内容是字符类型 */incrementstrtod(text,endptr);/* 字符类型的数字0.08是字符类型转换为浮点数字0.08 */}staticgbooleanfill1(gpointer user_data){GtkWidget*progress_bar1user_data;/* 获取当前进度条的值 */gdouble fraction1;fraction1gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar1));/* 每次调用此函数时将进度条增加10%标准写法是fraction fraction 0.1 缩写为 0.1*/fraction1increment;/* 根据fraction的值设定进度条显示的长度 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);/* 确保进度条的值保持在1.0以下*/if(fraction11.0)returnTRUE;returnFALSE;}staticgbooleanfill2(gpointer user_data){GtkWidget*progress_bar2user_data;/* 获取当前进度条的值 */gdouble fraction2;fraction2gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar2));/* 每次调用此函数时将进度条增加10%标准写法是fraction fraction 0.1 缩写为 0.1*/fraction20.1;/* 确保进度条的值保持在1.0以下让它无限循环*/if(fraction21.0)fraction20.0;/* 根据fraction的值设定进度条显示的长度 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar2),fraction2);/* 返回 TRUE,这样它就能够继续被调用 */returnTRUE;}staticvoidbegin(GtkWidget*widget,gpointer user_data){GtkWidget*progress_bar1user_data;gdouble fraction10.0;gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);g_timeout_add(time_interval,fill1,GTK_PROGRESS_BAR(progress_bar1));g_print(time_interval is: %d\n,time_interval);//用来调试程序在命令行下观察time_interval的值变化g_print(increment is: %f\n,increment);//用来调试程序在命令行下观察increment的值变化}staticvoidtoggle_orientation(GtkWidget*widget,gpointer user_data){GtkWidget*progress_bar2user_data;switch(gtk_progress_bar_get_inverted(GTK_PROGRESS_BAR(progress_bar2))){caseFALSE:gtk_progress_bar_set_inverted(GTK_PROGRESS_BAR(progress_bar2),TRUE);break;caseTRUE:gtk_progress_bar_set_inverted(GTK_PROGRESS_BAR(progress_bar2),FALSE);break;default:;// 什么也不做}}staticvoidactivate(GtkApplication*app,gpointer user_data){GtkWidget*window;GtkWidget*grid;GtkWidget*check1,*check2,*check3,*check4,*check5;GtkWidget*progress_bar1;GtkWidget*button1;//GtkWidget *hseparator;GtkWidget*label1,*label2,*label3;GtkWidget*progress_bar2;gdouble fraction10.0;gdouble fraction20.5;/* 创建具有标题和默认大小的窗口 */windowgtk_application_window_new(app);gtk_window_set_title(GTK_WINDOW(window),ProgressBar Example);gtk_window_set_default_size(GTK_WINDOW(window),500,200);gridgtk_grid_new();gtk_window_set_child(GTK_WINDOW(window),grid);gtk_widget_set_halign(grid,GTK_ALIGN_CENTER);gtk_widget_set_valign(grid,GTK_ALIGN_CENTER);/* 设置grid表格水平居中垂直居中 */check1gtk_check_button_new_with_label(慢);gtk_grid_attach(GTK_GRID(grid),check1,0,0,1,1);g_signal_connect(G_OBJECT(check1),toggled,G_CALLBACK(slow),NULL);check2gtk_check_button_new_with_label(中);gtk_check_button_set_group(GTK_CHECK_BUTTON(check2),GTK_CHECK_BUTTON(check1));/* 将三个按钮联系在一起实现三个中只能选择其中一个有效 */gtk_check_button_set_active(GTK_CHECK_BUTTON(check2),TRUE);gtk_grid_attach(GTK_GRID(grid),check2,1,0,1,1);g_signal_connect(G_OBJECT(check2),toggled,G_CALLBACK(middle),NULL);check3gtk_check_button_new_with_label(快);gtk_check_button_set_group(GTK_CHECK_BUTTON(check3),GTK_CHECK_BUTTON(check1));gtk_grid_attach(GTK_GRID(grid),check3,2,0,1,1);g_signal_connect(G_OBJECT(check3),toggled,G_CALLBACK(quick),NULL);check4gtk_check_button_new_with_label(自定义);gtk_grid_attach(GTK_GRID(grid),check4,3,0,1,1);g_signal_connect(G_OBJECT(check4),toggled,G_CALLBACK(custom),NULL);entry1gtk_entry_new();gtk_entry_set_placeholder_text(GTK_ENTRY(entry1),0.01-0.30);/* 在输入框中提示输入的数字范围 */gtk_entry_set_input_purpose(GTK_ENTRY(entry1),GTK_INPUT_PURPOSE_NUMBER);/* 在输入框中限制只能输入数字和小数点 */gtk_grid_attach(GTK_GRID(grid),entry1,4,0,1,1);label1gtk_label_new(先选择慢中快先输入数字再勾选自定义再点击开始);//First select slow, medium, or fast, then enter the number and check the custom option before clicking startgtk_grid_attach(GTK_GRID(grid),label1,0,1,4,1);/* 创建进度条并将其添加到窗口 */progress_bar1gtk_progress_bar_new();gtk_grid_attach(GTK_GRID(grid),progress_bar1,0,2,4,1);gtk_widget_set_valign(progress_bar1,GTK_ALIGN_CENTER);/* 设置进度条垂直居中 *//* 根据fraction的值设定进度条显示的长度进度条的值必须介于0.0-1.0含0.0-1.0之间*/gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);/* 每隔500毫秒运行一次fill函数 */g_timeout_add(500,fill1,GTK_PROGRESS_BAR(progress_bar1));button1gtk_button_new_with_label(开始);gtk_grid_attach(GTK_GRID(grid),button1,4,2,1,1);g_signal_connect(G_OBJECT(button1),clicked,G_CALLBACK(begin),progress_bar1);//hseparator gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);//gtk_grid_attach (GTK_GRID (grid), hseparator, 0, 1, 4, 1);label2gtk_label_new(——————分隔线——————);gtk_grid_attach(GTK_GRID(grid),label2,0,3,4,1);label3gtk_label_new(无限循环);//infinite loopgtk_grid_attach(GTK_GRID(grid),label3,0,4,4,1);progress_bar2gtk_progress_bar_new();gtk_grid_attach(GTK_GRID(grid),progress_bar2,0,5,4,1);gtk_widget_set_valign(progress_bar2,GTK_ALIGN_CENTER);/* 设置进度条垂直居中 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar2),fraction2);g_timeout_add(300,fill2,GTK_PROGRESS_BAR(progress_bar2));check5gtk_check_button_new_with_label(反方向);//opposite directiongtk_grid_attach(GTK_GRID(grid),check5,4,5,1,1);g_signal_connect(G_OBJECT(check5),toggled,G_CALLBACK(toggle_orientation),progress_bar2);gtk_window_present(GTK_WINDOW(window));}intmain(intargc,char**argv){GtkApplication*app;intstatus;appgtk_application_new(org.gtk.example,G_APPLICATION_DEFAULT_FLAGS);g_signal_connect(app,activate,G_CALLBACK(activate),NULL);statusg_application_run(G_APPLICATION(app),argc,argv);g_object_unref(app);returnstatus;}效果图如下
第115页的gtk+编程例子——进度条改写网上的例子用gtk4编译
发布时间:2026/7/3 18:10:02
第115页的gtk编程例子——进度条改写网上的例子用gtk4编译主要是参考网络《GTK 2.0 中文教程》中进度条 Progress Bars的例子程序源代码出处是http://www.huzheng.org/ebook/gtk2-tut/x892.html第115页的gtk编程例子——最简单的进度条2附带使用Anjuta写gtk程序的步骤https://blog.csdn.net/weixin_42145772/article/details/125022694在openSUSE-Leap-15.6-DVD-x86_64的gnome45.3桌面环境下编译的其中pkg-config --cflags gtk4两边有反引号括起来的ruhongvnclocalhost:~/gtk4 gcc -g -Wallpkg-config --cflags gtk4page1154.cpkg-config --libs gtk4-o page1154#includestdlib.h#includegtk/gtk.hstaticinttime_interval500;/* 定义全局变量time_interval并设定初始值为500 */staticgdouble increment0.1;staticGtkWidget*entry1;staticvoidslow(void){time_interval800;/* 改变全局变量time_interval的值为800 */}staticvoidmiddle(void){time_interval500;}staticvoidquick(void){time_interval200;}staticvoidcustom(void){constchar*text;GtkEntryBuffer*buffer;char*endptrNULL;buffergtk_entry_get_buffer(GTK_ENTRY(entry1));textgtk_entry_buffer_get_text(buffer);/* 获取用户在输入框entry1输入的数字内容例如0.08此时的数字内容是字符类型 */incrementstrtod(text,endptr);/* 字符类型的数字0.08是字符类型转换为浮点数字0.08 */}staticgbooleanfill1(gpointer user_data){GtkWidget*progress_bar1user_data;/* 获取当前进度条的值 */gdouble fraction1;fraction1gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar1));/* 每次调用此函数时将进度条增加10%标准写法是fraction fraction 0.1 缩写为 0.1*/fraction1increment;/* 根据fraction的值设定进度条显示的长度 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);/* 确保进度条的值保持在1.0以下*/if(fraction11.0)returnTRUE;returnFALSE;}staticgbooleanfill2(gpointer user_data){GtkWidget*progress_bar2user_data;/* 获取当前进度条的值 */gdouble fraction2;fraction2gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(progress_bar2));/* 每次调用此函数时将进度条增加10%标准写法是fraction fraction 0.1 缩写为 0.1*/fraction20.1;/* 确保进度条的值保持在1.0以下让它无限循环*/if(fraction21.0)fraction20.0;/* 根据fraction的值设定进度条显示的长度 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar2),fraction2);/* 返回 TRUE,这样它就能够继续被调用 */returnTRUE;}staticvoidbegin(GtkWidget*widget,gpointer user_data){GtkWidget*progress_bar1user_data;gdouble fraction10.0;gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);g_timeout_add(time_interval,fill1,GTK_PROGRESS_BAR(progress_bar1));g_print(time_interval is: %d\n,time_interval);//用来调试程序在命令行下观察time_interval的值变化g_print(increment is: %f\n,increment);//用来调试程序在命令行下观察increment的值变化}staticvoidtoggle_orientation(GtkWidget*widget,gpointer user_data){GtkWidget*progress_bar2user_data;switch(gtk_progress_bar_get_inverted(GTK_PROGRESS_BAR(progress_bar2))){caseFALSE:gtk_progress_bar_set_inverted(GTK_PROGRESS_BAR(progress_bar2),TRUE);break;caseTRUE:gtk_progress_bar_set_inverted(GTK_PROGRESS_BAR(progress_bar2),FALSE);break;default:;// 什么也不做}}staticvoidactivate(GtkApplication*app,gpointer user_data){GtkWidget*window;GtkWidget*grid;GtkWidget*check1,*check2,*check3,*check4,*check5;GtkWidget*progress_bar1;GtkWidget*button1;//GtkWidget *hseparator;GtkWidget*label1,*label2,*label3;GtkWidget*progress_bar2;gdouble fraction10.0;gdouble fraction20.5;/* 创建具有标题和默认大小的窗口 */windowgtk_application_window_new(app);gtk_window_set_title(GTK_WINDOW(window),ProgressBar Example);gtk_window_set_default_size(GTK_WINDOW(window),500,200);gridgtk_grid_new();gtk_window_set_child(GTK_WINDOW(window),grid);gtk_widget_set_halign(grid,GTK_ALIGN_CENTER);gtk_widget_set_valign(grid,GTK_ALIGN_CENTER);/* 设置grid表格水平居中垂直居中 */check1gtk_check_button_new_with_label(慢);gtk_grid_attach(GTK_GRID(grid),check1,0,0,1,1);g_signal_connect(G_OBJECT(check1),toggled,G_CALLBACK(slow),NULL);check2gtk_check_button_new_with_label(中);gtk_check_button_set_group(GTK_CHECK_BUTTON(check2),GTK_CHECK_BUTTON(check1));/* 将三个按钮联系在一起实现三个中只能选择其中一个有效 */gtk_check_button_set_active(GTK_CHECK_BUTTON(check2),TRUE);gtk_grid_attach(GTK_GRID(grid),check2,1,0,1,1);g_signal_connect(G_OBJECT(check2),toggled,G_CALLBACK(middle),NULL);check3gtk_check_button_new_with_label(快);gtk_check_button_set_group(GTK_CHECK_BUTTON(check3),GTK_CHECK_BUTTON(check1));gtk_grid_attach(GTK_GRID(grid),check3,2,0,1,1);g_signal_connect(G_OBJECT(check3),toggled,G_CALLBACK(quick),NULL);check4gtk_check_button_new_with_label(自定义);gtk_grid_attach(GTK_GRID(grid),check4,3,0,1,1);g_signal_connect(G_OBJECT(check4),toggled,G_CALLBACK(custom),NULL);entry1gtk_entry_new();gtk_entry_set_placeholder_text(GTK_ENTRY(entry1),0.01-0.30);/* 在输入框中提示输入的数字范围 */gtk_entry_set_input_purpose(GTK_ENTRY(entry1),GTK_INPUT_PURPOSE_NUMBER);/* 在输入框中限制只能输入数字和小数点 */gtk_grid_attach(GTK_GRID(grid),entry1,4,0,1,1);label1gtk_label_new(先选择慢中快先输入数字再勾选自定义再点击开始);//First select slow, medium, or fast, then enter the number and check the custom option before clicking startgtk_grid_attach(GTK_GRID(grid),label1,0,1,4,1);/* 创建进度条并将其添加到窗口 */progress_bar1gtk_progress_bar_new();gtk_grid_attach(GTK_GRID(grid),progress_bar1,0,2,4,1);gtk_widget_set_valign(progress_bar1,GTK_ALIGN_CENTER);/* 设置进度条垂直居中 *//* 根据fraction的值设定进度条显示的长度进度条的值必须介于0.0-1.0含0.0-1.0之间*/gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar1),fraction1);/* 每隔500毫秒运行一次fill函数 */g_timeout_add(500,fill1,GTK_PROGRESS_BAR(progress_bar1));button1gtk_button_new_with_label(开始);gtk_grid_attach(GTK_GRID(grid),button1,4,2,1,1);g_signal_connect(G_OBJECT(button1),clicked,G_CALLBACK(begin),progress_bar1);//hseparator gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);//gtk_grid_attach (GTK_GRID (grid), hseparator, 0, 1, 4, 1);label2gtk_label_new(——————分隔线——————);gtk_grid_attach(GTK_GRID(grid),label2,0,3,4,1);label3gtk_label_new(无限循环);//infinite loopgtk_grid_attach(GTK_GRID(grid),label3,0,4,4,1);progress_bar2gtk_progress_bar_new();gtk_grid_attach(GTK_GRID(grid),progress_bar2,0,5,4,1);gtk_widget_set_valign(progress_bar2,GTK_ALIGN_CENTER);/* 设置进度条垂直居中 */gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress_bar2),fraction2);g_timeout_add(300,fill2,GTK_PROGRESS_BAR(progress_bar2));check5gtk_check_button_new_with_label(反方向);//opposite directiongtk_grid_attach(GTK_GRID(grid),check5,4,5,1,1);g_signal_connect(G_OBJECT(check5),toggled,G_CALLBACK(toggle_orientation),progress_bar2);gtk_window_present(GTK_WINDOW(window));}intmain(intargc,char**argv){GtkApplication*app;intstatus;appgtk_application_new(org.gtk.example,G_APPLICATION_DEFAULT_FLAGS);g_signal_connect(app,activate,G_CALLBACK(activate),NULL);statusg_application_run(G_APPLICATION(app),argc,argv);g_object_unref(app);returnstatus;}效果图如下