基于c语言的GUI(gtk)的简单学生管理系统
welcome
hello world! 这是第一次写博客,同时将本次课上实训的小作业展示出来 ,请多多关照。
GUI
Graphics User Interface)
图形用户界面,是计算机与使用者之间的对话接口,是计算机重要的组成部分,比如说咱们使用电脑或手机看到的Windows的桌面或wps软件显示的窗口界面等都是GUI,都是图形界面开发出来的图形界面的软件。
GTK+是一套在GIMP的基础上发展而来的高级的、可伸缩的现代化、跨平台图形工具包,它可以很方便地制作图形交互界面( GUI )。
GTK+特点:
稳定、跨平台、多种语言绑定、接口丰富、与时俱进、算法丰富、移动嵌入式应用广泛
[link]http://www.gtk.org/features.php
多余不叙述 直接附图账号shifeng 密码:123456
查询界面 id :001 - 004 name:Shifeng等等
部分代码
首先是创建打开数据库haha1.db:
// An highlighted block
result1 = sqlite3_open("haha1.db", &db);
if(result1 != SQLITE_OK)
{
printf("open error!");
return -1;
}
创建数据表 xin存的是登陆账号信息 person存的的学生的姓名、分数、学号
const char *sql7 = "create table xin(zhanghao char, mima text);";
sqlite3_exec(db, sql7, NULL, NULL, &errmsg);
const char *sql = "create table person(id char, name 'text', mark int);";
sqlite3_exec(db, sql, NULL,NULL, &errmsg);
插入信息到表中
const char *sql1 = "insert into xin values( 'shifeng', '123456');";//帐号:shifeng 密码: 123456
int ret1 = sqlite3_exec(db, sql1 , NULL, NULL, &errmsg);
const char *sql5 = "insert into person values( '001', 'Peter', 80);";
sqlite3_exec(db, sql5 , NULL,NULL,&errmsg);
const char *sql2 = "insert into person values( '002', 'Jerry', 90);";
sqlite3_exec(db, sql2 , NULL,NULL,&errmsg);
const char *sql3 = "insert into person values( '003', 'Shifeng', 70);";
sqlite3_exec(db, sql3 , NULL,NULL,&errmsg);
const char *sql4 = "insert into person values( '004', 'Tony', 70);";
到这里数据库就差不多了
然后创建界面 :这是主界面 不重要
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *test_button;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
gtk_window_set_title(GTK_WINDOW(window), "学生管理系统");
gtk_widget_set_size_request(window, 800, 800);
// set the organization of window
GtkWidget *table = gtk_table_new(4, 4, TRUE);
gtk_container_add(GTK_CONTAINER(window), table);
GtkWidget *label_title = gtk_label_new("学生管理系统");
gtk_table_attach_defaults(GTK_TABLE(table), label_title, 0, 4, 0, 1);
GtkWidget *label_info = gtk_label_new("帐号:");
gtk_table_attach_defaults(GTK_TABLE(table), label_info, 0, 1, 1, 2);
label_pc = gtk_label_new("密码:");
gtk_table_attach_defaults(GTK_TABLE(table), label_pc, 0, 1, 2, 3);
entry1=gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(entry1),"please input account number:");
gtk_table_attach_defaults(GTK_TABLE(table), entry1, 1, 4, 1, 2);
entry2=gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(entry2),"password");
gtk_table_attach_defaults(GTK_TABLE(table), entry2, 1, 4, 2, 3);
// setting for button
GtkWidget *button1 = gtk_button_new_with_label("登录");
gtk_table_attach_defaults(GTK_TABLE(table), button1, 0, 2, 3, 4);
GtkWidget *button2 = gtk_button_new_with_label("关闭");
gtk_table_attach_defaults(GTK_TABLE(table), button2, 2, 4, 3, 4);
点击按钮事件 回调函数
g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit), NULL);//退出
g_signal_connect(G_OBJECT(button1), "clicked",G_CALLBACK(panduan), NULL);//进入其他函数开始数据库查询判断
g_signal_connect(button2, "clicked", G_CALLBACK (gtk_main_quit), NULL); //退出
判断函数panduan() 获取text文本信息 :
同时别忘了全局定义:GtkWidget *entry1=NULL;
还有类型转换GTK_ENYRT(entry1)
const char *str = gtk_entry_get_text(GTK_ENTRY(entry1)); //帐号
const char *str1 = gtk_entry_get_text(GTK_ENTRY(entry2)); //密码
用获取到的信息去表中查找,例如我输入shifeng, 而数据库查询语句就是:select zhanghao from xin where zhanghao = ’shifeng‘;此处我用的是sprintf()来写,出现了很多错误,双引号是只读区域,不能修改。gtk entry get text返回的字符串是禁止修改的sprintf会修改第一个参数指向的内存区域。错误:const char *str = gtk_entry_get_text(GTK_ENTRY(entry1)); sprintf(sql2, “select zhanghao from xin where zhanghao = ‘%s’;”, str);
解决办法:
char c[50],d[50];
for ( i = 0; str[i] != '\0'; i++)
*(c+i) = *(str+i);
i[c] = '\0';
for ( i = 0; str1[i] != '\0'; i++)
*(d+i) = *(str1+i);
i[d] = '\0';
printf("%s\n", str);
char *sql2 = malloc(100);
strcpy(sql2, c);
sprintf(sql2, "select zhanghao from xin where zhanghao ='%s';", c);
判断语句:ret == SQLITE_OK 仅仅是判断执行语句是否正确
我是用这句话来判断查找信息是否存在:
result = sqlite3_get_table(db, sql3, &dbresult, &nrow, &ncolumn, &errmsg);
代码
int ret2 = sqlite3_exec(db, sql2, NULL , NULL, &errmsg);
printf("sql2: %s\n", sql2);
printf("ret2: %d\n", ret2);
printf("errmsg: %s\n", errmsg);
if(ret2 == SQLITE_OK)//判断帐号
{
char *sql3 = malloc(100);
strcpy(sql3, d);
sprintf(sql3, "select mima from xin where zhanghao = '%s'and mima = '%s' ;", c, d);//查询密码和帐号匹配语句
int ret3 = sqlite3_exec(db, sql3, NULL , NULL, &errmsg);
printf("sql3: %s\n", sql3);
printf("errmsg: %s\n", errmsg);
if(ret3 == SQLITE_OK)//判断密码
{
result = sqlite3_get_table(db, sql3, &dbresult, &nrow, &ncolumn, &errmsg);
if(nrow == 0)
printf("帐号密码:没有这个信息!");
else
show_test_window();// 如果正确进入查询界面
// print_stu_db_get_table(db,sql2,sql3);
// show_test_window();// 如果正确进入查询界面
}
else
printf("语句错误!\n"); //密码错误
}
else
printf("语句错误!\n"); //帐号错误
代码在资源里 :
源代码,里面有操作过程,注意事项,认真看博客
或者:在微信搜索公众号:MeiXiangDao2020 媒想到叭
回复:学生管理系统 获取资源