五筆打字通主頁
上一篇文章,我已經把題庫由txt文件轉為sqlite數據庫db文件,這篇文章就把上上篇文章的答題系統修改一下,把題庫由car3.txt改成student.db,關于sqlite數據庫操作的基本操作,參見我的文章 tkinter之SQLite操作 題庫源文件變了,其它的有關代碼也做相應的改變,并不難,我都是用查找更改的方法改了不少地方?! ∝钾~
改進的代碼如下:
from tkinter import * import webbrowser import sqlite3 def wb98(): webbrowser.open('http://www.wb98.com',new=1) def Wheel_y(event): a= int(-(event.delta)/60) can1.yview('scroll',a,'units') root=Tk() # 源碼來自wb98.com root.title('用畫布做一個答題系統 wb98.com') scr1=Scrollbar(root) # 垂直滾動條 scr1.pack(side=RIGHT,fill=Y) can1=Canvas(root,bg='lightblue',width=10,height=10) # 畫面設置一個淺藍色,便于你看清各組件的位置 can1.pack(side=LEFT,expand=True,fill=BOTH) # 畫布定位 # result[i-1][0]:題目 result[i-1][1]:選項1 result[i-1][2]:選項2 result[i-1][3]:選項3 result[i-1][4]:選項4 # result[i-1][5]:答案 result[i-1][6]:圖片名 conn=sqlite3.connect('student.db') #創建或打開數據庫 # 創建游標對象 cur=conn.cursor() # 創建游標對象 # SQL語句 cur.execute('select * from text2sqlite where id between ? and ?',(1,10)) # 查詢id值范圍為1-10之間的記錄 result=cur.fetchmany(10) # 獲取10條查詢記錄 # print('id=1至10的記錄:',result) # print('-----') la=dict() # 題目字典 img = dict() # 生成一個空字典,用于下面循環地創建變量 # 以下設各變量為字典,便于循環時生成各組件插入Text組件 option1 = dict() # 生成答案選項1組件字典 option2 = dict() # 生成答案選項2字典 option3 = dict() # 生成答案選項3字典 option4 = dict() # 生成答案選項4字典 # 以下設各變量為字典,便于循環時生成各組件插入Text組件 var_ra = dict() var_ch1 = dict() var_ch2 = dict() var_ch3 = dict() var_ch4 = dict() str_daan = '' # 答案字符串初始化 x,y=10,10 # 坐標初始化 ff1=15 # 字體大小 ff2=10 # 字體大小 font1=('黑體',-ff1) # 字體大小前加- 表示是像素大小 font2=('宋體',-ff2) hh=10 # 上下間距 bmp_h=200 # 圖片的高度 # 以下是循環出題的代碼 ------------------ for i in range(1, 11): id = str(result[i-1][0])+":" # 題目序號 來自wb98.com何老師的濟亨網 la[i]=Label(can1,text=id+result[i-1][1],justify=LEFT, font=font1) can1.create_window(x,y,window=la[i],anchor=NW) la[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff1+hh # 下一組件的起始位置為當前位置+字體高+間隔 if result[i-1][7] == '': img[i] = PhotoImage() # 沒有相關圖片 else: img[i] = PhotoImage(file='.\\image\\'+result[i-1][7]) # 圖片是在安裝目錄下的image文件夾里 can1.create_image(x,y,image=img[i],anchor=NW) y=y+bmp_h+hh str_daan = str_daan + result[i-1][6]+',' # 把答案記下來,交卷用于核對 if len(result[i-1][6]) == 1: # 單選題 var_ra[i] = IntVar(value=0) option1[i] = Radiobutton(can1, text='A. '+result[i-1][2], bg='white', activebackground='white', variable=var_ra[i], value=1) can1.create_window(x,y,window=option1[i],anchor=NW) option1[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff2+4+hh # 下一個組件起始坐標:當前位置+字體大小+4個像素間距 option2[i] = Radiobutton(can1, text='B. '+result[i-1][3], bg='white', activebackground='white', variable=var_ra[i], value=2) can1.create_window(x,y,window=option2[i],anchor=NW) option2[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff2+4+hh # 下一個組件起始坐標:當前位置+字體大小+4個像素間距 option3[i] = Radiobutton(can1, text='C. '+result[i-1][4], bg='white', activebackground='white', variable=var_ra[i], value=3) can1.create_window(x,y,window=option3[i],anchor=NW) option3[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff2+4+hh # 下一個組件起始坐標:當前位置+字體大小+4個像素間距 option4[i] = Radiobutton(can1, text='D. '+result[i-1][5], bg='white', activebackground='white', variable=var_ra[i], value=4) can1.create_window(x,y,window=option4[i],anchor=NW) option4[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff2+4+hh # 下一個組件起始坐標:當前位置+字體大小+4個像素間距 y=y+10 else: var_ch1[i] = BooleanVar(value=False) var_ch2[i] = BooleanVar(value=False) var_ch3[i] = BooleanVar(value=False) var_ch4[i] = BooleanVar(value=False) option1[i] = Checkbutton( can1, text='A. '+result[i-1][2], bg='white', activebackground='white', variable=var_ch1[i]) can1.create_window(x,y,window=option1[i],anchor=NW) option1[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff2+4+hh # 下一個組件起始坐標:當前位置+字體大小+4個像素間距 option2[i] = Checkbutton( can1, text='B. '+result[i-1][3], bg='white', activebackground='white', variable=var_ch2[i]) can1.create_window(x,y,window=option2[i],anchor=NW) option2[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff2+4+hh # 下一個組件起始坐標:當前位置+字體大小+4個像素間距 option3[i] = Checkbutton( can1, text='C. '+result[i-1][4], bg='white', activebackground='white', variable=var_ch3[i]) can1.create_window(x,y,window=option3[i],anchor=NW) option3[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff2+4+hh # 下一個組件起始坐標:當前位置+字體大小+4個像素間距 option4[i] = Checkbutton( can1, text='D. '+result[i-1][5], bg='white', activebackground='white', variable=var_ch4[i]) can1.create_window(x,y,window=option4[i],anchor=NW) option4[i].bind("<MouseWheel>", Wheel_y) # 為組件綁定鼠標滾動事件 y=y+ff2+4+hh # 下一個組件起始坐標:當前位置+字體大小+4個像素間距 y=y+10 # 以上是循環出題的代碼-------------- wb98.com def dafei(): daan = str_daan.split(',') # 把答案字符串分解 for i in range(1, 11): # 單選題 if len(daan[i-1]) == 1: # 單選題 if daan[i-1] == str(var_ra[i].get()): print('第'+str(i)+"題回答正確") else: print('第'+str(i)+"題回答錯誤") print(" 正確答案:" + daan[i-1]) print(" 你的答案:" + str(var_ra[i].get())) else: # 多選題 duo = '' if var_ch1[i].get() == True: duo = '1' if var_ch2[i].get() == True: duo = duo+'2' if var_ch3[i].get() == True: duo = duo+'3' if var_ch4[i].get() == True: duo = duo+'4' if daan[i-1] == duo: print('第'+str(i)+"題回答正確") else: print('第'+str(i)+"題回答錯誤") print(" 正確答案:" + daan[i-1]) print(" 你的答案:" + duo) y=y+hh*2 # 再加2個間隔,插入按鈕 but1 = Button(can1, text=" 立 即 交 卷 ", command=dafei) # 交卷打分 can1.create_window(x,y,window=but1,anchor=NW) but1 = Button(can1, text=" 訪 問 官 網 ", command=wb98) # 交卷打分 can1.create_window(x+200,y,window=but1,anchor=NW) can1.config(yscrollcommand = scr1.set) # 綁定垂直滾動條 scr1.config(command = can1.yview) can1.config(scrollregion=(0,0,650,y+100)) # 保證滾動范圍正好是圖片的寬高 can1.bind("<MouseWheel>", Wheel_y) # 為畫布綁定鼠標滾動事件 root.geometry('700x650+588+224') # root.wm_deiconify() # 讓窗體顯現 root.mainloop()
運行結果
此文章來自:wb98.com 網站還有相關的系列課程文章,感興趣的可以前往。
來源:濟亨網
本文鏈接:http://www.chinaengraver.com/post/348.html