Builder.py是基于sqlite3,python gui的猜谜游戏
2021.9.25
1、上传了数据库的备用库
2、新增未选中提示框
3、新增是否重新游戏的功能 用到了easygui的ccbox返回True or False来进行判断
4、新增数据库为空时,自动插入数据的功能
5、优化了一下代码结构
【bug修复】
1、修复了弹出未选中提示框后题目切到下一题的问题
2、修复了重复游戏分数累加的问题
# -*- conding:utf-8 -*-
import sqlite3
import tkinter
from tkinter import *
from tkinter.messagebox import *
from easygui import ccbox
def opendb():
conn = sqlite3.connect('test2.db')
cursor = conn.execute(
"create table if not exists [exam]([question] varchar(80) null,[Answer_A] varchar(1) null,[Answer_B] varchar(1) null,[Answer_C] varchar(1) null,[Answer_D] varchar(1) null,[right_Answer] varchar(1) null)")
return cursor, conn
def showalldb():
# print("--处理后的数据--")
hel = opendb()
cur = hel[1].cursor()
cur.execute("select * from exam")
res = cur.fetchall()
cur.close()
return res
# 生成试题库
def shiti():
# welcome = """---开始添加...---"""
# print(welcome)
hel = opendb()
hel[1].execute(
"insert into exam(question,Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values('11有多重','50g','40g','30g','动态变化','D')")
hel[1].execute(
"insert into exam(question,Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values('焦糖有多重','50g','40g','30g','动态变化','A')")
hel[1].execute(
"insert into exam(question,Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values('布丁有多重','50g','40g','30g','动态变化','C')")
hel[1].execute(
"insert into exam(question,Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values('秋叶有多重','50g','40g','30g','动态变化','B')")
hel[1].execute(
"insert into exam(question,Answer_A,Answer_B,Answer_C,Answer_D,right_Answer) values('秋葵有多重','50g','40g','30g','动态变化','D')")
hel[1].commit()
# print('数据添加......')
showalldb()
hel[1].close()
def callnext():
global k
global score
useranswer = r.get()
print("你选择的是", r.get(), '正确答案是', values[k][5])
if useranswer == 'E':
showinfo(title="警告!", message="warning:请进行选择")
elif useranswer == values[k][5]:
showinfo(title="回答正确!", message="回答正确!")
score += 10
k = k + 1
else:
showinfo(title="回答错误!", message="回答错误!")
k = k + 1
# print("k的值是...", k)
if k == len(values):
# showinfo(title="题目回答完毕", message=("题目回答完毕!\n你的总分是: %d\n 是否重新开始游戏?" % score))
flag = ccbox(msg=("题目回答完毕!\n你的总分是: %d\n是否重新开始游戏?" % score), title='题目回答完毕', choices=('确定', '退出'), image=None)
# 重置题目和分数
if flag:
k = 0
score = 0
else:
closewin()
return
# 这里遍历赋值去显示新题目
timu["text"] = '标题:', values[k][0]
radio1["text"] = '1、', values[k][1]
radio2["text"] = '2、', values[k][2]
radio3["text"] = '3、', values[k][3]
radio4["text"] = '4、', values[k][4]
r.set('E')
def callresult():
# 打印出分数窗口用的
showinfo("当前总分:", str(score))
def closewin():
root.destroy()
if __name__ == "__main__":
root = tkinter.Tk()
root.title('问答游戏')
root.geometry("500x200")
values = showalldb() # 题库内容,列表嵌套了元组,k是列表索引,0是元组索引, 每一个列表里有5项
if len(values) == 0:
print("当前题库为空,正在插入数据....")
shiti()
if len(values) != 0:
print("题目一共有%d题" % (len(values)))
r = tkinter.StringVar()
r.set('E') # 玩家选的默认值是E,也就是不选中提交
k = 0
score = 0
timu = tkinter.Label(root, text=('题目: ', values[k][0])) # 标题
timu.pack()
f1 = Frame(root)
f1.pack()
radio1 = tkinter.Radiobutton(f1, variable=r, value='A', text=('1、', values[k][1]))
radio1.pack()
radio2 = tkinter.Radiobutton(f1, variable=r, value='B', text=('2、', values[k][2]))
radio2.pack()
radio3 = tkinter.Radiobutton(f1, variable=r, value='C', text=('3、', values[k][3]))
radio3.pack()
radio4 = tkinter.Radiobutton(f1, variable=r, value='D', text=('4、', values[k][4]))
radio4.pack()
f2 = Frame(root)
f2.pack()
Button(f2, text="下一题", command=callnext).pack(side=LEFT)
Button(f2, text="结果", command=callresult).pack(side=RIGHT)
Button(f2, text="关闭", command=closewin).pack(side=RIGHT)
root.mainloop()