写在前面:
笔者最近学习了python,了解了python的一些用法之后,写了基于SQLite数据库和easygui的知识问答的小程序。程序实现了试题的添加、作答、判断正误、分数统计等简单的业务。个人觉得,此程序逻辑比较简单,适合初学者理解,决定把源码贡献出来,供大家参考学习。
个人领悟:
笔者写的比较多的是c/c++/java等语言的代码,刚入手python,特别不适应它以缩进作为代码作用域的书写风格。不过,写多了,也就适应了。python的强大在于它在模块中封装了很多易用的内置方法,这种函数式编程对于代码实现来说比较便利,使得代码简洁易懂,比较适合初学者入门编程。但是就我个人而言,还是觉得c/c++/Java的代码更具有编程的灵魂,更有助于开发者理解编程的原理。当然了,语言只是工具,各有优劣,没必要争个高低。只要便于我们开发程序,就是最好的语言。
对于SQLite,它属于轻量级的关系数据库,一定意义上类似于文档,比较方便创建和访问数据库。easygui这个图像界面模块(总结的easygui开发文档供参考:Mr.Hachi:Python 模块EasyGui详细介绍(转载)),在我使用的过程中发现了里面还是有些bug,比如点击关闭按钮没有起到关闭程序的作用,点击取消,不能返回上一级界面。当然,它比较易用,方便开发,但是也存在不便于开发者设计界面,也就是界面过于死板,只适合一些比较常见界面的程序开发。如果有方法可以解决以上我的问题或者我的思路存在问题,欢迎留言,指正!
源码如下:
# -*- coding: utf-8 -*-
import easygui as g
import sys
# 导入SQLite驱动
import sqlite3,os
# 连接到SQLite数据库
# 数据库文件是testQueLib.db
# 如果文件不存在,那么会自动在当前目录创建一个数据库文件:
# 执行一条SQL语句,创建testQueLib表:
#第一次执行代码,需要放开此处代码,用于创建数据库
#conn = sqlite3.connect('testQueLib.db')
#cursor = conn.cursor()
#cursor.execute('create table testQueLibs(id integer PRIMARY KEY autoincrement, title varchar(100), A varchar(100), B varchar(100), C varchar(100), D varchar(100),crrectAnswer varchar(100))')
#cursor.close()
# 提交事务:
#conn.commit()
#关闭Connection:
#conn.close()
msg ="欢迎使用知识问答小程序"
title = "知识问答小程序"
choices = ["答题", "进入后台"]
choice = g.buttonbox(msg, title, choices)
qId = 1 #用于通过id查询数据
score = 0 #统计分数
option = [] #用于存放试题选项
if str(choice) == "答题":
while True:
conn = sqlite3.connect('testQueLib.db')
cursor = conn.cursor()
cursor.execute('select * from testQueLibs where id= %d'%(qId))
values = cursor.fetchall()
cursor.close()
conn.commit()
conn.close()
if values == []: #数据库返回值为空列表,答题结束
g.msgbox("恭喜你,您已经回答完题库中的所有(共%d)道题。您共答对 %d 道题!"%(qId - 1,score))
break
value = values[0] #values返回的是一个列表,列表里的元素是一个元组,此处获取元组数据
for i in range(len(value)): #一共7个字段
if i == 1:
queTest = value[i] #获取试题
if i > 1 and i < 6:
option.append(value[i]) #获取选项
if i == 6:
answer = value[i] #获取正确答案
choice=g.choicebox(msg=queTest,title='答题',choices=option)
if str(choice) == answer: #判断选择的答案是否正确
score += 1 #回答正确加一分
g.msgbox("Well down")
else:
g.msgbox("The correct Answer is '%s'"%(answer))
qId += 1 #id加一,用于访问下一条数据
option.clear() #每次回答完毕试题,清空选项列表
if str(choice) == "进入后台":
msg ="请选择功能:"
title = "知识问答小程序"
ciocFun = ["添加题目"]
choice=g.buttonbox(msg,title,ciocFun)
if str(choice) == "添加题目":
while True:
msg = "欢迎使用知识问答小程序"
title = "添加题目"
fieldTitle = ["*试题","*A","*B","*C","*D","*正确答案"]
fieldValues = []
fieldValues = g.multenterbox(msg,title,fieldTitle)
while True:
if fieldValues == None :
break
errmsg = ""
for i in range(len(fieldTitle)):
option = fieldTitle[i].strip()
if fieldValues[i].strip() == "" and option[0] == "*":
errmsg += ("【%s】为必填项 " %fieldTitle[i])
if errmsg == "":
break
fieldValues = g.multenterbox(errmsg,title,fieldNames,fieldValues)
conn = sqlite3.connect('testQueLib.db')
cursor = conn.cursor()
cursor.execute('insert into testQueLibs (title,A,B,C,D,crrectAnswer) values ('%s','%s', '%s','%s', '%s', '%s')'%(fieldValues[0],fieldValues[1],fieldValues[2],fieldValues[3],fieldValues[4],fieldValues[5]))
# 通过rowcount获得插入的行数:
if cursor.rowcount == 1:
g.msgbox("添加试题成功!")
else:
g.msgbox("添加试题失败!")
cursor.close()
conn.commit()
conn.close()
程序效果图: