GTK图形界面编程-计算器的实现

上传人:huo****ian 文档编号:135287430 上传时间:2022-08-15 格式:DOC 页数:22 大小:368.51KB
返回 下载 相关 举报
GTK图形界面编程-计算器的实现_第1页
第1页 / 共22页
GTK图形界面编程-计算器的实现_第2页
第2页 / 共22页
GTK图形界面编程-计算器的实现_第3页
第3页 / 共22页
点击查看更多>>
资源描述
目录1引言1.1课题背景1.2课程设计目的1.3课程设计任务2系统需求分析2.1功能需求分析2.2 性能需求分析3总体设计3.1功能模块分析与设计3.2 系统功能模块设计4系统功能测试4.1一个Helloworld窗口4.2计算器功能测试5 课程设计总结参考文献1引言1.1课题背景简单的计算器是一种能实现加、减、乘、除等简单运算的工具。要实现计算功能,可以用C语言的知识和GTK+编写程序来解决此问题。该计算器大大的降低了数字计算的难度及提高了计算的准确度和精确度。该计算器使用非常简单和方便,对广大中小学生的学习有巨大帮助作用,也对在职人员的工作有点帮助作用。GTK+2.0 是自由软件,并且是GNU 工程的一部分1。GTK+2.0 的许可协议LGPL,允许任何开发者使用(包括那些开发中的专利软件)且不收任何费用。GTK+2.0 是当今惟一百分之百零付费的工业级的图形界面开发工具。本设计就以 GTK+2.0 为开发工具,全面展示在Linux 平台上开发应用程序的各个侧面,也展现在Linux 平台上开发图形界面应用程序。计算机信息管理技术的应用,除了能在相当大的程度上代替人工作业,从而减少人员工作量,减轻工作负担,减少工作中因人为原因而产生的错误从而避免不必要的损失外,更重要的是能建立准确畅通、简便的信息流通渠道,为工作提供所需要的准确、及时的信息以帮助做出正确而及时的选择与决定,从而给采用这门技术的单位带来了巨大的可见或不可见的利益与效益。1.2课程设计目的现在大多数的计算器都具备+,-,*,/等四则运算的功能。用计算器来算数显然比用脑袋或用纸笔计算要来得方便。讲究高效的我们势必要用到傻瓜设备(就是拿到手看看说明就知道怎样使用的东东)。当我们看到一个很长很大的表达式需要得到结果时,我们就会想到计算器,这样,本程序就是为解决大家基本四则运算的问题而产生的。只要你读懂说明,那么你所输入的表达式就一定能得到正确的结果。 本文主要基于对表达式的分析并利用C进行编程进而实现算法的。与Java和C#等其他高级语言相比,C在程序运行效率、内存使用的可控性和编程的灵活性上均具有较大的优势2,与汇编语言和C语言更具有面向对象的优点,因此本文采用Ubuntu Linux操作系统以及GTK+2.0,以达到算法快速有效地执行。1.3课程设计任务本课程设计内容是在Linux平台下开发一个简单的计算器程序,采用GCC编程工具和GTK+2.0工具包等软件为开发工具以及C语言知识实现图形化的计算器程序。该程序能够实现的对整数的加减乘除和小数的加减乘除。2系统需求分析2.1功能需求分析(1) 整数之间的加减乘除运算,如:1+2、6-5、24/12、90*2等。(2) 小数之间的加减乘除运算,如:1.2+2.3、3.1-1.2、4.2*1.9、66.1/2.1等。(3) 小数与整数之间的加减乘除运算,如:1.4+4、2.4*6等。2.2 性能需求分析(1)硬件环境处理器:奔腾4或以上。内存:128MB或以上。硬盘空间:20M以上。(2)软件环境操作系统:Linux Kernel 2.6.20以上版本。工具软件:GTK+2.0工具包、GCC编程工具。(3) 技术需求GCC,即GNU Compiler Collection,GNU编译器套装,是一套由 GNU 开发的编程语言编译器。它是一套以GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。可处理C、C+、 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言3。GTK+是一种图形用户界面工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于GUI 的应用程序4。可以把GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建GUI 的许多已经准备好的构造块。使用 GTK+ 这样的库比起编写自己的 GUI 代码来有多个优势。例如,它可以显著节约开发时间,让开发人员把精力集中在项目真正重要和真正独特的地方,而不必重复公共的功能。对于用户来说,这意味着 他们使用的应用程序之间具有更好的一致性:工具包能在哪使用,应用程序就能跟到哪里。就像使用LEGO一样,所有的人都使用同一兼容尺寸这一事实,意味着设计可以在使用库的人之间共享,不论他们在哪里使用它。3总体设计3.1功能模块分析与设计本计算器主要是完成整数之间、小数之间、整数和小数之间的加减乘除的运算,使用GTK+完成界面布局。根据需求分析的结果,总体结构如图3-1所示。简单的计算器整数间的四则运算小数间的四则运算整数小数间的四则运算图3-1 总体结构图3.2 系统功能模块设计本课程设计所实现的计算器可以分为以下几个模块实现:(1) 图形界面设计(2) 数字键处理模块(3) 小数点处理模块(4) 加减乘除运算按键处理模块(5) 结果按键,即等号处理模块(6) 清除模块3.2.1 图形界面设计此程序采用一个纵向盒状容器和多个横向盒状容器来设计界面。另外在单行输入控件的阅读方向属性上用函数gtk_widget_set_direction 设定为GTK_TEXT_DIR_RTL,即从右向左,使此控件的数字显示更像一个计算器的显示屏。(1)主窗体关键代码:window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /主窗体G_CALLBACK(gtk_main_quit),NULL);gtk_window_set_title(GTK_WINDOW(window),我的计算器); /窗体名称gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);gtk_container_set_border_width(GTK_CONTAINER(window),10);vbox = gtk_vbox_new(FALSE,0);gtk_container_add(GTK_CONTAINER(window),vbox);hbox = gtk_hbox_new(FALSE,0);gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);(2) 各个按键布局的关键代码:label = gtk_label_new(Calculator); /标签名称gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5);button = gtk_button_new_with_label(C); /清除按键gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,5);构建一个hbox1容纳数字“1”、“2”、“3”、“+”四个按键:hbox1 = gtk_hbox_new(FALSE,0); /hbox1的构建gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);button = gtk_button_new_with_label(3); /按键3gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);G_CALLBACK(on_num_clicked),NULL);button = gtk_button_new_with_label(2); /按键2gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);G_CALLBACK(on_num_clicked),NULL);button = gtk_button_new_with_label(1); /按键1gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);类似的构建hbox2控件容纳“4”、“5”、“6”和“-”四个按键,hbox3容纳“7”、“8”、“9”和“*”四个按键,hbox4容纳“0”、“.”、“=”和“/”四个按键。而对于hbox1hbox4,是控件vbox的子类,布局如下:gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);gtk_box_pack_start(GTK_BOX(vbox),hbox2,FALSE,FALSE,5);gtk_box_pack_start(GTK_BOX(vbox),hbox3,FALSE,FALSE,5);gtk_box_pack_start(GTK_BOX(vbox),hbox4,FALSE,FALSE,5);3.2.2数字键处理模块数字按钮 09 的功能是向计算器输入数字,通过计算和定位,最后显示出来,所以它们的回调函数都是同一个,只不过传递的参数根据不同的按钮传递不同的数字,关键代码如下:void on_num_clicked (GtkButton* button,gpointer data) /当数定键按下时执行const gchar *num;gint i;if(have_result)clear_all(); /有结果则全部清除if(count = 6) return; /够6位数则不能再输入数字count+;num = gtk_button_get_label(GTK_BUTTON(button); /取数i = g_strlcat(number,num,100); /保存if(first)nn = strtod(number,NULL); /数一elsemm = strtod(number,NULL); /数二gtk_entry_set_text(GTK_ENTRY(entry),number); /显示3.2.3小数点处理模块小数点按钮的回调函数是较特殊的一个。首先小数点在一个数中只能出现一次,再按的话则不起作用,小数点按钮在点击后要对所输入的数字做一下处理,使之成为浮点数,并且让后续数字也转换为相应的浮点数字,关键代码如下:void on_dot_clicked (GtkButton* button,gpointer data) /当小数点按下时gint i;if(have_result)clear_all(); /全部清除if(have_dot = FALSE) /如果无小数点则可以have_dot = TRUE;i = g_strlcat(number,.,100);gtk_entry_set_text(GTK_ENTRY(entry),number);/如果有小数点则不输出3.2.4运算按键处理模块本计算器软件只有加减乘除4种运算功能,这4个运算按钮用了同一个回调函数,根据传递的参数设定当前的计算方法。其关键代码如下:switch(GPOINTER_TO_INT(data)case 1: /当+时s = 1;gtk_entry_set_text(GTK_ENTRY(entry),);first = FALSE ; count = 0; break;case 2: /当-时s = 2;gtk_entry_set_text(GTK_ENTRY(entry),);first = FALSE ; count = 0; break;case 3: /当*时s = 3;gtk_entry_set_text(GTK_ENTRY(entry),);first = FALSE ; count = 0; break;case 4: /当/时s = 4;gtk_entry_set_text(GTK_ENTRY(entry),);first = FALSE ; count = 0; break;3.2.5等号按键处理模块等号按钮的回调函数是根据当前的计算方法进行相应的运算,并将运算结果输出到单行输出控件中。其关键代码如下:switch(s) /判断四则运算的符号case 1: /当+时numb = nn+mm;break;case 2: /当-时numb = nn-mm;break;case 3: /当*时numb = nn*mm;break;case 4: /当/时numb = nn/mm;break;3.2.6清除模块清除按钮的功能是清除当前显示,同时清除所有标记,将标记设为默认等。关键代码如下:void clear_all (void) /清除所有相关标记gint i;gtk_entry_set_text(GTK_ENTRY(entry),);nn = 0;/第一个数清零mm = 0 ;/第二个数清零s = 0;count = 0 ;first = TRUE;have_dot = FALSE;/小数点标记have_result = FALSE;/结果标记for(i = 0 ; i 100 ; i+)numberi = 0;4系统功能测试4.1一个Helloworld窗口本例子是使用GTK+2.0编写一个helloworld.c的程序,用以显示一个窗口,并且在这个窗口的标题栏上显示字符串“Hello,world!”。程序截图如图4-1。图4-1 使用vim编写helloworld.c运行gcc -Wall helloworld.c -o helloworld pkg-config -cflags -libs gtk+-2.0命令编译后,执行./helloworld出现窗口,如图4-2所示。图4-2 Helloworld窗口4.2计算器功能测试(1)计算器主界面,如图4-3所示。图4-3 计算器主界面(2) 加法运算演示:55+346=401,如图4-4、4-5、4-6所示。 图4-4输入55图4-5输入346 图4-6 按下等号得出结果(2)乘法运算演示:321*22=7062,如图4-7、4-8、4-9所示。图4-7 输入321图4-8 输入22图4-9 按下等号输出结果(3)除法运算演示:100/3=33.33333,如图4-10、4-11、4-12所示。图4-10 输入100图4-11 输入3图4-11 按下等号输出结果5 课程设计总结通过两周周的数据结构课程设计,我顺利的完成了Linux平台下图形界面计算器设计的课程设计。感觉在这次课程设计中自己受益匪浅,不仅将以前在课堂上学到的东西从新又巩固了一遍,并且又有所创新,将数据结构的知识与Linux知识相结合,做出了功能丰富的应用程序,还有就是同时发现了以前的不足,及时的弥补!在课程设计中遇见的课题中的很多技术问题,当然要感谢邓老师能给予认真的指导,并培养我们独立自立的能力,让我们对自学能力有了很高的提高,在各方面,提高了我们的主动积极性。同时也要谢谢同学们的相互帮助,感谢有了这些,我才能很好的顺利的完成我的这次课程设计。参考文献1宋国伟.GTK+2.0编程范例北京:清华大学出版社,2002.112谭诰强.C程序设计北京:清华大学出版社,2004.63Kurt Wall et al.GUN/Linux编程指南(第二版)北京:清华大学出版社,2002.64严蔚敏,吴伟民.数据结构(C语言版) 北京:清华大学出版,2009.4源程序清单:#include #include static GtkWidget *entry; /定义单行输入控件来显示输入输出的数字gint count = 0 ; /计位gdouble nn = 0 ; /计数一gdouble mm = 0 ; /计数二gint s = 0 ; /算法gboolean first = TRUE; /首次输入gboolean have_dot = FALSE; /是否有小数点gboolean have_result = FALSE; /是否有结果输出gchar number100; /保存用户输入的数字void clear_all (void) /清除所有相关标记gint i;gtk_entry_set_text(GTK_ENTRY(entry),);nn = 0;mm = 0 ;s = 0;count = 0 ;first = TRUE;have_dot = FALSE;have_result = FALSE;for(i = 0 ; i 100 ; i+)numberi = 0;void on_num_clicked (GtkButton* button,gpointer data) /当数定键按下时执行const gchar *num;gint i;if(have_result)clear_all();/有结果则全部清除if(count = 6) return; /够6位数则不能再输入数字count+;num = gtk_button_get_label(GTK_BUTTON(button);/取数i = g_strlcat(number,num,100);/保存if(first)nn = strtod(number,NULL);/数一elsemm = strtod(number,NULL);/数二gtk_entry_set_text(GTK_ENTRY(entry),number);/显示void on_dot_clicked (GtkButton* button,gpointer data) /当小数点按下时gint i;if(have_result)clear_all();/全部清除if(have_dot = FALSE) /如果无小数点则可以have_dot = TRUE;i = g_strlcat(number,.,100);gtk_entry_set_text(GTK_ENTRY(entry),number);/如果有小数点则不输出void on_clear_clicked (GtkButton* button,gpointer data)clear_all();/全部清除void on_suan_clicked (GtkButton* button,gpointer data) /当计算按钮 +,-,*,/ 按下时gint i;switch(GPOINTER_TO_INT(data)case 1: /当+时s = 1;gtk_entry_set_text(GTK_ENTRY(entry),);first = FALSE ; count = 0; break;case 2: /当-时s = 2;gtk_entry_set_text(GTK_ENTRY(entry),);first = FALSE ; count = 0; break;case 3: /当*时s = 3;gtk_entry_set_text(GTK_ENTRY(entry),);first = FALSE ; count = 0; break;case 4: /当/时s = 4;gtk_entry_set_text(GTK_ENTRY(entry),);first = FALSE ; count = 0; break;have_dot = FALSE;for(i = 0 ; i 100 ; i+) /清除数字numberi = 0;void on_eq_clicked (GtkButton* button,gpointer data) /当等号键按钮按下时double numb;gchar num100;gchar *result;switch(s)case 1: /当+时numb = nn+mm;break;case 2: /当-时numb = nn-mm;break;case 3: /当*时numb = nn*mm;break;case 4: /当/时numb = nn/mm;break;result = g_ascii_dtostr(num,100,numb);gtk_entry_set_text(GTK_ENTRY(entry),result);have_result = TRUE;int main ( int argc , char* argv)GtkWidget *window;GtkWidget *vbox;GtkWidget *hbox,*hbox1,*hbox2,*hbox3,*hbox4;GtkWidget *button;GtkWidget *label;gtk_init(&argc,&argv);window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /主窗口g_signal_connect(G_OBJECT(window),delete_event,G_CALLBACK(gtk_main_quit),NULL);gtk_window_set_title(GTK_WINDOW(window),我的计算器); /主窗口标签栏gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);gtk_container_set_border_width(GTK_CONTAINER(window),10);vbox = gtk_vbox_new(FALSE,0);gtk_container_add(GTK_CONTAINER(window),vbox);hbox = gtk_hbox_new(FALSE,0);gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);label = gtk_label_new(Calculator);gtk_box_pack_start(GTK_BOX(hbox),label,TRUE,TRUE,5);button = gtk_button_new_with_label(C);gtk_box_pack_start(GTK_BOX(hbox),button,TRUE,TRUE,5);g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_clear_clicked),NULL);entry = gtk_entry_new();gtk_widget_set_direction(entry,GTK_TEXT_DIR_RTL);gtk_box_pack_start(GTK_BOX(vbox),entry,FALSE,FALSE,5);hbox1 = gtk_hbox_new(FALSE,0);/定义hbox1容纳3、2、1、+gtk_box_pack_start(GTK_BOX(vbox),hbox1,FALSE,FALSE,5);button = gtk_button_new_with_label(3);/按键3gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);button = gtk_button_new_with_label(2);/按键2gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);button = gtk_button_new_with_label(1);/按键1gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);button = gtk_button_new_with_label(+);/按键+g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_suan_clicked),(gpointer)1);gtk_box_pack_start(GTK_BOX(hbox1),button,TRUE,TRUE,5);hbox2 = gtk_hbox_new(FALSE,0);/定义hbox2容纳6、5、4、-gtk_box_pack_start(GTK_BOX(vbox),hbox2,FALSE,FALSE,5);button = gtk_button_new_with_label(6);/按键6g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox2),button,TRUE,TRUE,5);button = gtk_button_new_with_label(5);/按键5g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox2),button,TRUE,TRUE,5);button = gtk_button_new_with_label(4);/按键4g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox2),button,TRUE,TRUE,5);button = gtk_button_new_with_label(-);/按键-g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_suan_clicked),(gpointer)2);gtk_box_pack_start(GTK_BOX(hbox2),button,TRUE,TRUE,5);hbox3 = gtk_hbox_new(FALSE,0);/定义hbox3容纳9、8、7、*gtk_box_pack_start(GTK_BOX(vbox),hbox3,FALSE,FALSE,5);button = gtk_button_new_with_label(9);/按键9g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox3),button,TRUE,TRUE,5);button = gtk_button_new_with_label(8);/按键8g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox3),button,TRUE,TRUE,5);button = gtk_button_new_with_label(7);/按键7g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox3),button,TRUE,TRUE,5);button = gtk_button_new_with_label(*);/按键*g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_suan_clicked),(gpointer)3);gtk_box_pack_start(GTK_BOX(hbox3),button,TRUE,TRUE,5);hbox4 = gtk_hbox_new(FALSE,0);/定义hbox4容纳0、.、=、/gtk_box_pack_start(GTK_BOX(vbox),hbox4,FALSE,FALSE,5);button = gtk_button_new_with_label(0);/按键0g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_num_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox4),button,TRUE,TRUE,5);button = gtk_button_new_with_label(.);/按键.g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_dot_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox4),button,TRUE,TRUE,5);button = gtk_button_new_with_label(=);/按键=g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_eq_clicked),NULL);gtk_box_pack_start(GTK_BOX(hbox4),button,TRUE,TRUE,5);button = gtk_button_new_with_label(/);/按键/g_signal_connect(G_OBJECT(button),clicked,G_CALLBACK(on_suan_clicked),(gpointer)4);gtk_box_pack_start(GTK_BOX(hbox4),button,TRUE,TRUE,5);gtk_widget_show_all(window);gtk_main();return FALSE;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 中学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!