Python基于Tkinter實(shí)現(xiàn)的垃圾分類(lèi)答題軟件代碼
一、Tkinter
什么是GUI
圖形用戶(hù)界面(Graphical User Interface,簡(jiǎn)稱(chēng) GUI,又稱(chēng)圖形用戶(hù)接口)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶(hù)界面。圖形用戶(hù)界面是一種人與計(jì)算機(jī)通信的界面顯示格式,允許用戶(hù)使用鼠標(biāo)等輸入設(shè)備操縱屏幕上的圖標(biāo)或菜單選項(xiàng),以選擇命令、調(diào)用文件、啟動(dòng)程序或執(zhí)行其它一些日常任務(wù)。與通過(guò)鍵盤(pán)輸入文本或字符命令來(lái)完成例行任務(wù)的字符界面相比,圖形用戶(hù)界面有許多優(yōu)點(diǎn)。
圖形用戶(hù)界面由窗口、下拉菜單、對(duì)話(huà)框及其相應(yīng)的控制機(jī)制構(gòu)成,在各種新式應(yīng)用程序中都是標(biāo)準(zhǔn)化的,即相同的操作總是以同樣的方式來(lái)完成,在圖形用戶(hù)界面,用戶(hù)看到和操作的都是圖形對(duì)象,應(yīng)用的是計(jì)算機(jī)圖形學(xué)的技術(shù)。
GUI 編程類(lèi)似于“搭積木”,將一個(gè)個(gè)組件(Widget)放到窗口中。如下是 windows 中的 畫(huà)圖軟件,就是一個(gè)典型的 GUI 程序:
常用的 GUI 庫(kù)
1. Tkinter
tkinter(Tk interface)是 Python 的標(biāo)準(zhǔn) GUI 庫(kù),支持跨平臺(tái)的 GUI 程序開(kāi)發(fā)。tkinter 適合小型的 GUI 程序編寫(xiě),也特別適合初學(xué)者學(xué)習(xí) GUI 編程。本次以 tkinter 為核心進(jìn)行講解。
2. wxPython
wxPython 是比較流行的 GUI 庫(kù),適合大型應(yīng)用程序開(kāi)發(fā),功能強(qiáng)于 tkinter,整體設(shè)計(jì) 框架類(lèi)似于 MFC(Microsoft Foundation Classes 微軟基礎(chǔ)類(lèi)庫(kù))。
3. PyQT
Qt 是一種開(kāi)源的 GUI 庫(kù),適合大型 GUI 程序開(kāi)發(fā),PyQT 是 Qt 工具包標(biāo)準(zhǔn)的 Python 實(shí)現(xiàn)。我們也可以使用 Qt Desginer 界面設(shè)計(jì)器快速開(kāi)發(fā) GUI 應(yīng)用程序 。
一個(gè)最簡(jiǎn)單的 Tkinter 程序至少應(yīng)包含以下四個(gè)部分:
- 導(dǎo)入 tkinter 模塊
- 創(chuàng)建主窗口,也稱(chēng) root 窗口(即根窗口)
- 添加人機(jī)交互控件,同時(shí)編寫(xiě)相應(yīng)的事件函數(shù)
- 通過(guò)主循環(huán)(mainloop)來(lái)顯示主窗口
二、最終效果
先來(lái)看看本次項(xiàng)目的最終效果:
項(xiàng)目運(yùn)行之后,程序會(huì)從題庫(kù)中隨機(jī)抽取10道題目來(lái)測(cè)試,當(dāng)你答對(duì)或答錯(cuò)都會(huì)有彈窗提示,答對(duì)一道得10分,當(dāng)題目全部答完后會(huì)提示你題目已做完,并顯示你本次考試的最終得分。話(huà)不多說(shuō),開(kāi)始上教程。
三、項(xiàng)目過(guò)程
3.1分析布局
由于本次只是做一個(gè)簡(jiǎn)易的答題程序,所以整體頁(yè)面不需要太復(fù)雜。首先,需要Label標(biāo)簽來(lái)顯示每道題的題目,接著就是4個(gè)垂直擺放(或橫向)單選框按鈕,最后下面放個(gè)下一題的點(diǎn)擊按鈕。
3.2創(chuàng)建窗口
做任何項(xiàng)目,都需要先創(chuàng)建主窗口,也稱(chēng) root 窗口(即根窗口)。
# 導(dǎo)入本次項(xiàng)目用到的庫(kù) import tkinter from tkinter import * from tkinter.messagebox import * import random if __name__ == '__main__': root = tkinter.Tk() # 創(chuàng)建tkinter對(duì)象 root.title('垃圾分類(lèi)答題考試') # 設(shè)置標(biāo)題 root.geometry("500x200+500+300") # 設(shè)置頁(yè)面的位置和長(zhǎng)寬 root.mainloop() # 讓窗口一直顯示出來(lái)
效果如下:
3.3構(gòu)建題庫(kù)
本次做的是垃圾分類(lèi)的答題程序,所以我在網(wǎng)上找了一些關(guān)于垃圾分類(lèi)的題目。這里我就直接用列表套元組的方式來(lái)存儲(chǔ)數(shù)據(jù)了。說(shuō)明一下,元組中的第一個(gè)是題目,后面依次是ABCD選項(xiàng),最后是本題的答案選項(xiàng)。
# 準(zhǔn)備一個(gè)題庫(kù)列表 object_list = [ ('包了口香糖的紙巾屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('保鮮膜屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('變質(zhì)的香腸屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('檳榔渣屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('剝掉的蛋殼屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('菜刀屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('茶葉渣應(yīng)扔進(jìn)哪個(gè)垃圾桶?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('吃剩的餅干渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('抽完煙的煙蒂是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('刀片屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('掉在地上的樹(shù)葉是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('廢棄的食用油屬于?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('甘蔗渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('過(guò)期的化妝品是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('過(guò)期的貓糧屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('包裝藥片的鋁箔屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('喝茶剩下的茶葉渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('花生殼屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('壞掉的電腦屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('灰色塑料袋屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('回形針屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('雞骨頭屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('雞毛屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('家庭盆栽廢棄的樹(shù)葉是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('堿性電池屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('膠卷屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('舊涼席屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('舊圖書(shū)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('空的滅火器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('老舊電視機(jī)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('落發(fā)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('沒(méi)用完的鉛筆屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('沒(méi)有泡過(guò)的茶葉屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('哪一類(lèi)可進(jìn)行資源再生利用?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('蘋(píng)果手機(jī)電池屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('破碎的碗碟屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('染發(fā)劑的容器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('殺蟲(chóng)劑的容器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('水果硬糖屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('水銀溫度計(jì)屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('撕掉了的舊照片,應(yīng)該丟到哪個(gè)垃圾桶內(nèi)?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('塑料筷子屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('塑料玩具是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('糖果包裝紙屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('西瓜籽屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ]
3.4創(chuàng)建組件
前面我們分析了本次項(xiàng)目的布局情況,需要1個(gè)Label便簽、4個(gè)單選按鈕、1個(gè)下一題按鈕,現(xiàn)在就開(kāi)始將它們放置在主窗口中,從題庫(kù)中隨機(jī)抽取10道題目并顯示第一道題目。
# 導(dǎo)入本次項(xiàng)目用到的庫(kù) import tkinter from tkinter import * from tkinter.messagebox import * import random # 準(zhǔn)備一個(gè)題庫(kù)列表 object_list = [ ('包了口香糖的紙巾屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('保鮮膜屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('變質(zhì)的香腸屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('檳榔渣屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('剝掉的蛋殼屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('菜刀屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('茶葉渣應(yīng)扔進(jìn)哪個(gè)垃圾桶?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('吃剩的餅干渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('抽完煙的煙蒂是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('刀片屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('掉在地上的樹(shù)葉是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('廢棄的食用油屬于?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('甘蔗渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('過(guò)期的化妝品是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('過(guò)期的貓糧屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('包裝藥片的鋁箔屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('喝茶剩下的茶葉渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('花生殼屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('壞掉的電腦屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('灰色塑料袋屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('回形針屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('雞骨頭屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('雞毛屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('家庭盆栽廢棄的樹(shù)葉是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('堿性電池屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('膠卷屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('舊涼席屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('舊圖書(shū)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('空的滅火器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('老舊電視機(jī)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('落發(fā)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('沒(méi)用完的鉛筆屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('沒(méi)有泡過(guò)的茶葉屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('哪一類(lèi)可進(jìn)行資源再生利用?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('蘋(píng)果手機(jī)電池屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('破碎的碗碟屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('染發(fā)劑的容器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('殺蟲(chóng)劑的容器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('水果硬糖屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('水銀溫度計(jì)屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('撕掉了的舊照片,應(yīng)該丟到哪個(gè)垃圾桶內(nèi)?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('塑料筷子屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('塑料玩具是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('糖果包裝紙屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('西瓜籽屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ] if __name__ == '__main__': root = tkinter.Tk() # 創(chuàng)建tkinter對(duì)象 root.title('垃圾分類(lèi)答題考試') # 設(shè)置標(biāo)題 root.geometry("500x200+500+300") # 設(shè)置頁(yè)面的位置和長(zhǎng)寬 # 從題庫(kù)中隨機(jī)抽取10個(gè)題目作為考試題 values = random.sample(object_list,10) # 創(chuàng)建一個(gè)字符串變量用來(lái)記錄選項(xiàng)值 s = tkinter.StringVar() s.set('E') # 設(shè)置初始值為'E',初始沒(méi)選中 # 設(shè)置初始題號(hào)和分值 num = 0 score = 0 label = tkinter.Label(root, text=values[num][0]) # 用來(lái)顯示題目 label.pack() # 創(chuàng)建第 1 個(gè) Frame 組件 f1 = Frame(root) f1.pack() r1 = tkinter.Radiobutton(f1, variable=s, value='A', text=values[num][1]) # 安裝第一個(gè)單選按鈕 r1.pack() r2 = tkinter.Radiobutton(f1, variable=s, value='B', text=values[num][2]) # 安裝第二個(gè)單選按鈕 r2.pack() r3 = tkinter.Radiobutton(f1, variable=s, value='C', text=values[num][3]) # 安裝第三個(gè)單選按鈕 r3.pack() r4 = tkinter.Radiobutton(f1, variable=s, value='D', text=values[num][4]) # 安裝第四個(gè)單選按鈕 r4.pack() # 創(chuàng)建第 2 個(gè) Frame 組件 f2 = Frame(root) f2.pack() # 創(chuàng)建下一題的按鈕 Button(f2, text='下一題').pack(side=LEFT) # 默認(rèn)顯示第一道題目 label["text"] = str(num+1) + '.' + values[num][0] # 顯示題目 # 顯示4個(gè)選項(xiàng) r1["text"] = values[num][1] r2["text"] = values[num][2] r3["text"] = values[num][3] r4["text"] = values[num][4] root.mainloop() # 讓窗口一直顯示出來(lái)
效果如下:
現(xiàn)在你點(diǎn)擊下一題是沒(méi)有反應(yīng)的,因?yàn)榇藭r(shí)只是實(shí)現(xiàn)了頁(yè)面的布局工作,還沒(méi)有實(shí)現(xiàn)判斷對(duì)錯(cuò)的功能。
3.5編寫(xiě)事件函數(shù)
事件的邏輯是當(dāng)你點(diǎn)擊下一題按鈕的時(shí)候,程序判斷你對(duì)本題的選項(xiàng)是否與題庫(kù)中的答案一致,如果相等,則通過(guò)彈窗的形式提示你答對(duì)了;如果不相等,則通過(guò)彈窗的形式提示你答錯(cuò)了。提示完之后還要緊接著顯示下一道題目。每次判斷完之后都要檢測(cè)本題是否已經(jīng)是最后一道題目,如果是則停止答題,得出本次測(cè)試的總得分。
# 定義一個(gè)判斷選項(xiàng)正確性的函數(shù) def main(values): # 全局引用num和score變量 global num global score # 如果選項(xiàng)和答案相等則答對(duì)了 if s.get() == values[num][5]: showinfo("恭喜", "恭喜你答對(duì)了!") # 提示你答對(duì)了 score += 10 # 得分加10分 # 如果選項(xiàng)和答案不相等則答錯(cuò)了 else: showinfo("遺憾", "遺憾你答錯(cuò)了!") # 提示你答錯(cuò)了 num = num + 1 # 記錄題號(hào) # 如果題號(hào)已經(jīng)大于等于題目的總長(zhǎng)度則需要進(jìn)行結(jié)束并統(tǒng)計(jì)總分?jǐn)?shù) if num >= len(values): showinfo("結(jié)果", f"全部題目做完了!\n您的最終得分為{score}分!") # 提示題目做完了,總結(jié)出你的得分 root.quit() # 程序退出 return # 顯示下一題 label["text"] = str(num+1) + '.' + values[num][0] # 顯示題目 # 顯示4個(gè)選項(xiàng) r1["text"] = values[num][1] r2["text"] = values[num][2] r3["text"] = values[num][3] r4["text"] = values[num][4] s.set('E') # 設(shè)置初始值為'E',初始沒(méi)選中
同時(shí)還需要在下一題按鈕那添加該事件函數(shù)
Button(f2, text='下一題', command=lambda:main(values)).pack(side=LEFT)
到這里一個(gè)簡(jiǎn)易版的答題程序已經(jīng)實(shí)現(xiàn),效果如前面所示。
四、總結(jié)
本次使用了Python中的tkinter庫(kù)實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的垃圾分類(lèi)答題程序,其中的題庫(kù)和各種參數(shù)大家可以發(fā)揮自己的創(chuàng)意,自行進(jìn)行修改,基于此源碼的基礎(chǔ)上創(chuàng)作出你的作品!
源代碼
# 導(dǎo)入本次項(xiàng)目用到的庫(kù) import tkinter from tkinter import * from tkinter.messagebox import * import random # 準(zhǔn)備一個(gè)題庫(kù)列表 object_list = [ ('包了口香糖的紙巾屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('保鮮膜屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('變質(zhì)的香腸屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('檳榔渣屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('剝掉的蛋殼屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('菜刀屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('茶葉渣應(yīng)扔進(jìn)哪個(gè)垃圾桶?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('吃剩的餅干渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('抽完煙的煙蒂是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('刀片屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('掉在地上的樹(shù)葉是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('廢棄的食用油屬于?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('甘蔗渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('過(guò)期的化妝品是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('過(guò)期的貓糧屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('包裝藥片的鋁箔屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('喝茶剩下的茶葉渣是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('花生殼屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('壞掉的電腦屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('灰色塑料袋屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('回形針屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('雞骨頭屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('雞毛屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('家庭盆栽廢棄的樹(shù)葉是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('堿性電池屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('膠卷屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('舊涼席屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('舊圖書(shū)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('空的滅火器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('老舊電視機(jī)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('落發(fā)屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('沒(méi)用完的鉛筆屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('沒(méi)有泡過(guò)的茶葉屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('哪一類(lèi)可進(jìn)行資源再生利用?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('蘋(píng)果手機(jī)電池屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('破碎的碗碟屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('染發(fā)劑的容器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('殺蟲(chóng)劑的容器屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('水果硬糖屬于哪一類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ('水銀溫度計(jì)屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('撕掉了的舊照片,應(yīng)該丟到哪個(gè)垃圾桶內(nèi)?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'B'), ('塑料筷子屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('塑料玩具是什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'C'), ('糖果包裝紙屬于什么垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'A'), ('西瓜籽屬于哪類(lèi)垃圾?', '其他垃圾', '有害垃圾', '可回收物', '廚余垃圾', 'D'), ] # 定義一個(gè)判斷選項(xiàng)正確性的函數(shù) def main(values): # 全局引用num和score變量 global num global score # 如果選項(xiàng)和答案相等則答對(duì)了 if s.get() == values[num][5]: showinfo("恭喜", "恭喜你答對(duì)了!") # 提示你答對(duì)了 score += 10 # 得分加10分 # 如果選項(xiàng)和答案不相等則答錯(cuò)了 else: showinfo("遺憾", "遺憾你答錯(cuò)了!") # 提示你答錯(cuò)了 num = num + 1 # 記錄題號(hào) # 如果題號(hào)已經(jīng)大于等于題目的總長(zhǎng)度則需要進(jìn)行結(jié)束并統(tǒng)計(jì)總分?jǐn)?shù) if num >= len(values): showinfo("結(jié)果", f"全部題目做完了!\n您的最終得分為{score}分!") # 提示題目做完了,總結(jié)出你的得分 root.quit() # 程序退出 return # 顯示下一題 label["text"] = str(num+1) + '.' + values[num][0] # 顯示題目 # 顯示4個(gè)選項(xiàng) r1["text"] = values[num][1] r2["text"] = values[num][2] r3["text"] = values[num][3] r4["text"] = values[num][4] s.set('E') # 設(shè)置初始值為'E',初始沒(méi)選中 if __name__ == '__main__': root = tkinter.Tk() # 創(chuàng)建tkinter對(duì)象 root.title('垃圾分類(lèi)答題考試') # 設(shè)置標(biāo)題 root.geometry("500x200+500+300") # 設(shè)置頁(yè)面的位置和長(zhǎng)寬 # 從題庫(kù)中隨機(jī)抽取10個(gè)題目作為考試題 values = random.sample(object_list,10) # 創(chuàng)建一個(gè)字符串變量用來(lái)記錄選項(xiàng)值 s = tkinter.StringVar() s.set('E') # 設(shè)置初始值為'E',初始沒(méi)選中 # 設(shè)置初始題號(hào)和分值 num = 0 score = 0 label = tkinter.Label(root, text=values[num][0]) # 用來(lái)顯示題目 label.pack() # 創(chuàng)建第 1 個(gè) Frame 組件 f1 = Frame(root) f1.pack() r1 = tkinter.Radiobutton(f1, variable=s, value='A', text=values[num][1]) # 安裝第一個(gè)單選按鈕 r1.pack() r2 = tkinter.Radiobutton(f1, variable=s, value='B', text=values[num][2]) # 安裝第二個(gè)單選按鈕 r2.pack() r3 = tkinter.Radiobutton(f1, variable=s, value='C', text=values[num][3]) # 安裝第三個(gè)單選按鈕 r3.pack() r4 = tkinter.Radiobutton(f1, variable=s, value='D', text=values[num][4]) # 安裝第四個(gè)單選按鈕 r4.pack() # 創(chuàng)建第 2 個(gè) Frame 組件 f2 = Frame(root) f2.pack() # 創(chuàng)建下一題的按鈕 Button(f2, text='下一題', command=lambda:main(values)).pack(side=LEFT) # 默認(rèn)顯示第一道題目 label["text"] = str(num+1) + '.' + values[num][0] # 顯示題目 # 顯示4個(gè)選項(xiàng) r1["text"] = values[num][1] r2["text"] = values[num][2] r3["text"] = values[num][3] r4["text"] = values[num][4] root.mainloop()
到此這篇關(guān)于基于Tkinter實(shí)現(xiàn)的垃圾分類(lèi)答題軟件代碼的文章就介紹到這了,更多相關(guān)Tkinter實(shí)現(xiàn)垃圾分類(lèi)答題軟件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python Matplotlib繪制條形圖的全過(guò)程
Python畫(huà)圖主要用到matplotlib這個(gè)庫(kù),具體來(lái)說(shuō)是pylab和pyplot這兩個(gè)子庫(kù),這兩個(gè)庫(kù)可以滿(mǎn)足基本的畫(huà)圖需求,下面這篇文章主要給大家介紹了關(guān)于Python Matplotlib繪制條形圖的相關(guān)資料,需要的朋友可以參考下2021-10-10Python萬(wàn)物皆對(duì)象理解及源碼學(xué)習(xí)
這篇文章主要為大家介紹了Python萬(wàn)物皆對(duì)象的源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Django使用echarts進(jìn)行可視化展示的實(shí)踐
可視化是將數(shù)據(jù)轉(zhuǎn)換成圖形或圖像在屏幕上顯示出來(lái),本文主要介紹了Django使用echarts進(jìn)行可視化展示的實(shí)踐,感興趣的可以了解一下2021-06-06Python HTMLTestRunner庫(kù)安裝過(guò)程解析
這篇文章主要介紹了Python HTMLTestRunner庫(kù)安裝過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05python使用celery實(shí)現(xiàn)異步任務(wù)執(zhí)行的例子
今天小編就為大家分享一篇python使用celery實(shí)現(xiàn)異步任務(wù)執(zhí)行的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08python自動(dòng)導(dǎo)入包的實(shí)現(xiàn)
本文主要介紹了python自動(dòng)導(dǎo)入包的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04python3 tkinter實(shí)現(xiàn)添加圖片和文本
這篇文章主要為大家詳細(xì)介紹了python3 tkinter實(shí)現(xiàn)添加圖片和文本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11