python生成試題庫和介面 (python generate test database and layout)
阿新 • • 發佈:2020-08-10
來自《Python專案案例開發從入門到實戰》(清華大學出版社 鄭秋生 夏敏捷主編)中 資料庫應用--智力問答測試
生成試題庫以及介面程式碼:
注意: 要使程式碼執行成功,需要先看上一篇文章python生成資料庫(python generate database)先生成test_bank.db 資料庫才可以執行成功
1 import tkinter
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()
結果: