来自 《Python项目案例开发从入门到实战》(清华大学出版社 郑秋生 夏敏捷主编)中 数据库应用--智力问答测试
生成试题库以及界面代码:
注意: 要使代码运行成功,需要先看上一篇文章 python生成数据库(python generate database) 先生成 test_bank.db 数据库才可以运行成功
1 import tkinter # Tkinter模块是python的标准Tk GUI工具包的接口
2 # from tkinter import *
3 # from tkinter.messagebox import *
4 from tkinter import messagebox
5 import sqlite3
6
7
8 # 调用下一道题目函数
9 def callNext():
10 # 设置k和score为全局变量
11 global k
12 global score
13 # 得到单选按钮的结果
14 useranswer = r.get()
15 print(r.get())
16
17 # 判断答案是否为空
18 if useranswer == 'E':
19 messagebox.showinfo("出错", "请先完成本题")
20 # 判断答案是否等于正确答案
21 elif useranswer == values[k][5]:
22 # 如果相同则提示答对信息,messagebox是消息窗口组件
23 messagebox.showinfo("恭喜", "恭喜你对了")
24 # 添加分数
25 score += 10
26 # 跳转到下一题
27 k = k + 1
28 else:
29 # 打错了则提示错误提示
30 messagebox.showinfo("遗憾", "遗憾你错了")
31 # 跳转到下一题
32 k = k + 1
33
34 # 判断是否是最后一道题目
35 if k >= len(values):
36 messagebox.showinfo("提示", "题目做完了")
37 return
38 # 修改timu, radio1, radio2, radio3, radio4中的文本值
39 timu["text"] = values[k][0]
40 radio1["text"] = values[k][1]
41 radio2["text"] = values[k][2]
42 radio3["text"] = values[k][3]
43 radio4["text"] = values[k][4]
44 # 默认值还是设置为没有选中
45 r.set('E')
46
47
48 # 查看结果函数
49 def callResult():
50 tkinter.messagebox.showinfo("你的得分", str(score))
51
52
53 # 连接到 test_bank 数据库
54 conn = sqlite3.connect('test_bank.db')
55 # 创建游标对象
56 cursor = conn.cursor()
57 # 查询 exam 数据库表
58 cursor.execute('select * from exam')
59 # 提取查询到的数据存在values变量中
60 values = cursor.fetchall()
61 # 关闭cursor对象
62 cursor.close()
63 # 关闭connect对象
64 conn.close()
65
66 # 创建窗口对象
67 root = tkinter.Tk()
68 # 设置窗口标题
69 root.title('Python 智力问答游戏')
70 # 设置初始窗口大小为500*200
71 root.geometry("500x200")
72 # 创建一个StringVar()对象
73 r = tkinter.StringVar()
74 # 设置初始值为'E',即没有选中
75 r.set('E')
76 # 记录当前的题目指数
77 k = 0
78 # 记录得到的分数值
79 score = 0
80 # Label是标签组件,可以显示文本和位图
81 # 新建timu标签组件,标签的文本值是values中的[k][0]
82 timu = tkinter.Label(root, text=values[k][0])
83 # 将timu标签组件添加到窗口中显示
84 timu.pack()
85 # Frame是框架控件,在屏幕上显示一个矩形区域,多用来作为容器
86 # 新建第一个Frame组件
87 f1 = tkinter.Frame(root)
88 # 将组件添加到窗口中显示
89 f1.pack()
90 # Radiobutton是单选按钮控件,显示一个单选的按钮状态
91 # 用户可以使用variable属性为Radiobutton组件指定一个对应的变量。如果将多个Radiobutton组件绑定到同一个变量,则这些Radiobutton组件
92 # 属于一个分组,分组后需要使用value设置每个Radiobutton的值,以标识该项目是否被选中。
93 # 在框架控件f1中新建一个单选的按钮控件,并且指定单选按钮按下的变量值,单选按钮选中时变量的值value和单选按钮显示的文本内容text
94 radio1 = tkinter.Radiobutton(f1, variable=r, value='A', text=values[k][1])
95 # 将组件添加到窗口中显示
96 radio1.pack()
97 # 在框架控件f1中新建一个单选的按钮控件,并且指定单选按钮按下的变量值,单选按钮选中时变量的值value和单选按钮显示的文本内容text
98 radio2 = tkinter.Radiobutton(f1, variable=r, value='B', text=values[k][2])
99 # 将组件添加到窗口中显示
100 radio2.pack()
101 # 在框架控件f1中新建一个单选的按钮控件,并且指定单选按钮按下的变量值,单选按钮选中时变量的值value和单选按钮显示的文本内容text
102 radio3 = tkinter.Radiobutton(f1, variable=r, value='C', text=values[k][3])
103 # 将组件添加到窗口中显示
104 radio3.pack()
105 # 在框架控件f1中新建一个单选的按钮控件,并且指定单选按钮按下的变量值,单选按钮选中时变量的值value和单选按钮显示的文本内容text
106 radio4 = tkinter.Radiobutton(f1, variable=r, value='D', text=values[k][4])
107 # 将组件添加到窗口中显示
108 radio4.pack()
109
110 # 创建第2个Frame框架组件
111 f2 = tkinter.Frame(root)
112 # 将组件添加到窗口中显示
113 f2.pack()
114 # 在f2框架上新建Button组件,text表示按钮显示的内容,command表示点击按钮时执行的函数,side表示将Button组件添加到窗口中显示,左停靠
115 tkinter.Button(f2, text='下一题', command=callNext).pack(side=tkinter.LEFT)
116 # 在f2框架上新建Button组件,text表示按钮显示的内容,command表示点击按钮时执行的函数,side表示将Button组件添加到窗口中显示,左停靠
117 tkinter.Button(f2, text='结 果', command=callResult).pack(side=tkinter.LEFT)
118
119 # 进入消息循环,也就是显示窗口
120 root.mainloop()
结果: