Python課堂點名器,媽媽再也不會擔心我被老師點名了

一、概況

我們的三維世界並不能像四維世界那樣,時間是可以隨意控制的。時間過去就真的過去了,不得不說句時間過的有點快啊,高中一些片段的記憶還有時會浮現在腦海中。在高中課堂上,有的同學希望老師多提問一下自己,而有的同學在底下卻默默祈禱,希望別提問他,甚至有的同學認為老師提問他是跟他過不去。現在回頭想想,不知道會不會罵自己一句"鯊掉"。 那我們今天用Python程序寫一個課堂點名器,用到的是Python中的GUI編程,這個真的很公平了,不偏不向。最後跟大家說句話:請珍惜時間。

二、頁面搭建

我們用的是Python中的Tkinter模塊,我們大概做的功能有三個:

隨機點名懲罰日誌寫入

首先我們先簡單的把界面搭建出來,代碼很簡單:

import tkinter as tk class LoveYou(): # 初始化 def __init__(self): # 第1步,建立窗口window self.window = tk.Tk() # 第2步,給窗口的可視化起名字 self.window.title('班級考單詞程序') # 第3步,設定窗口的大小(長*寬) self.window.geometry('600x400') self.text = tk.StringVar() # 創建str類型 self.count = tk.StringVar() def take(self): ''' 負責隨機抽取同學提問 :return: ''' pass def kill(self): ''' 負責根據星期幾選擇不同懲罰遍數 :return: ''' pass def main(self): ''' 主函數負責繪製 :return: ''' # 繪製篩選信息 l2 = tk.Label(self.window, fg='red', textvariable=self.text, width=500, height=3) l2.config(font='Helvetica -%d bold' % 30) l2.pack() # 繪製懲罰信息 l3 = tk.Label(self.window, fg='red', textvariable=self.count, width=500, height=3) l3.config(font='Helvetica -%d bold' % 20) l3.pack() # 繪製篩選按鈕 btntake = tk.Button(self.window, text="篩選", width=15, height=2, command=self.take) btntake.pack() # 繪製懲罰按鈕 btnkill = tk.Button(self.window, text="懲罰", width=15, height=2, command=self.kill) btnkill.pack() # 進入循環 self.window.mainloop() if __name__ == '__main__': loveyou = LoveYou() loveyou.main()

我們點擊篩選按鈕的時候就會執行take函數,此函數主要負責隨機抽取同學。當我們點擊懲罰按鈕的時候就會執行kill函數 ,此函數主要負責懲罰同學。三、數據獲取

在班級我們一般都會有個班級人員名單(xxx.xlsx)。當我們初始化程序的時候,我們把本地的數據讀取到程序中。我們在本地創建一個表格寫點假數據:

通過xlrd模塊可以把數據讀取到程序中,但是我們需要安裝這個模塊:pip install xlrd

我們寫個函數讀取:

def read_data(self): ''' 數據讀取 :return: ''' workbook = xlrd.open_workbook('1801.xlsx') sheet1 = workbook.sheet_by_index(0) # sheet索引從0開始 data = sheet1.col_values(0) # 讀取第一列內容 # ['表格 1', '姓名', '小王', '老王', '小明', '小紅', '小綠', '小青', '小陳', '小趙', '小王', '小李', '小孫', '小周', '小吳', '小錢', '小史', '小三', '小四', '小五', '小六'] data.pop(0) # 把表格 1去掉 data.pop(0) # 把姓名 去掉 return data

這個函數中返回的data就是從本地讀取的同學名單。

四、點名實現

我們一共設定隨機次數,例如50次,直到最後隨機出來的同學才當做結果。大概邏輯如下:

def take(self): ''' 負責隨機抽取同學提問 :return: ''' for s in range(50): ''' 後幾秒慢點,製造緊張氣氛 ''' desc = '' if s == 47: time.sleep(0.5) elif s == 48: time.sleep(0.6) elif s == 48: time.sleep(0.7) elif s == 49: time.sleep(0.9) else: time.sleep(0.1) classes = random.sample(self.data, 2) desc += "呦,你被上帝選中了:%s\n" % classes[0] desc += "呦,你看著也很不錯呀:%s\n" % classes[1] self.text.set(desc) # 設置內容 self.window.update() # 屏幕更新

下面是動態圖展示:

五、懲罰實現

我們根據週一到週五,每天懲罰的量不一樣,懲罰的方式暫定抄寫吧。

def kill(self): ''' 負責根據星期幾選擇不同懲罰遍數 :return: ''' if self.day == 1: count = random.randint(50, 100) kill_desc = "上帝獎勵了你們組%d遍" % (count) elif self.day == 2: count = random.randint(50, 120) kill_desc = "上帝獎勵了你們組%d遍" % (count) self.count.set(kill_desc) elif self.day == 3: count = random.randint(50, 140) kill_desc = "上帝獎勵了你們組%d遍" % (count) elif self.day == 4: count = random.randint(50, 160) kill_desc = "上帝獎勵了你們組%d遍" % (count) self.count.set(kill_desc) elif self.day == 5: count = random.randint(50, 180) kill_desc = "上帝獎勵了你們組%d遍" % (count) else: kill_desc = '週末就別提問了' self.count.set(kill_desc) # 設置內容 self.window.update() # 屏幕更新

當我們點擊篩選後,再點擊懲罰,就出現罰寫的遍數了。

六、日誌實現

日誌主要為了記錄提問的人、什麼時候提問的、罰寫的遍數。我們都要把這些信息寫入到本地,要不第二天老師忘記考誰了,學生也不承認提問我了,所以日誌功能是必須的。 當最終提問人確定的時候調用savedesc函數 當點擊懲罰按鈕的時候調用savecount函數

def savedesc(self, desc): ''' 負責把選中的人寫入到log裡面 :param desc: :return: ''' with open('log.txt', 'a', encoding='utf-8') as f: f.write(self.gettime() + "\n" + desc) def savecount(self, count): ''' 負責把被罰寫的遍數寫入到log裡面 :param count: :return: ''' with open('log.txt', 'a', encoding='utf-8') as f: f.write(str(count) + '\n') f.write('--------------------------------\n')

本地文件格式如下:

有個記錄挺好的,省著賴賬。七、其他

基本功能就這些,我在界面上加了一些提示。比如今天的日期了,班級人數等等這些。

全部代碼:import tkinter as tk import xlrd import time import random import datetime class LoveYou(): # 初始化 def __init__(self): # 第1步,建立窗口window self.window = tk.Tk() # 第2步,給窗口的可視化起名字 self.window.title('班級考單詞程序') # 第3步,設定窗口的大小(長*寬) self.window.geometry('600x400') self.text = tk.StringVar() # 創建str類型 self.count = tk.StringVar() self.data = self.read_data() # 獲取星期幾 d = datetime.datetime.now() self.day = d.weekday() + 1 def read_data(self): ''' 數據讀取 :return: ''' workbook = xlrd.open_workbook('1801.xlsx') sheet1 = workbook.sheet_by_index(0) # sheet索引從0開始 data = list(sheet1.col_values(0)) # 讀取第一列內容 # ['表格 1', '姓名', '小王', '老王', '小明', '小紅', '小綠', '小青', '小陳', '小趙', '小王', '小李', '小孫', '小周', '小吳', '小錢', '小史', '小三', '小四', '小五', '小六'] data.pop(0) # 把表格 1去掉 data.pop(0) # 把姓名 去掉 return data def take(self): ''' 負責隨機抽取同學提問 :return: ''' for s in range(50): ''' 後幾秒慢點,製造緊張氣氛 ''' desc = '' if s == 47: time.sleep(0.5) elif s == 48: time.sleep(0.6) elif s == 48: time.sleep(0.7) elif s == 49: time.sleep(0.9) else: time.sleep(0.1) classes = random.sample(self.data, 2) desc += "呦,你被上帝選中了:%s\n" % classes[0] desc += "呦,你看著也很不錯呀:%s\n" % classes[1] if s == 49: self.savedesc(desc) # 寫入日誌 self.text.set(desc) # 設置內容 self.window.update() # 屏幕更新 def kill(self): ''' 負責根據星期幾選擇不同懲罰遍數 :return: ''' if self.day == 1: count = random.randint(50, 100) kill_desc = "上帝獎勵了你們組%d遍" % (count) elif self.day == 2: count = random.randint(50, 120) kill_desc = "上帝獎勵了你們組%d遍" % (count) self.count.set(kill_desc) elif self.day == 3: count = random.randint(50, 140) kill_desc = "上帝獎勵了你們組%d遍" % (count) elif self.day == 4: count = random.randint(50, 160) kill_desc = "上帝獎勵了你們組%d遍" % (count) self.count.set(kill_desc) elif self.day == 5: count = random.randint(50, 180) kill_desc = "上帝獎勵了你們組%d遍" % (count) else: kill_desc = '週末就別提問了' self.count.set(kill_desc) # 設置內容 self.window.update() # 屏幕更新 self.savecount(kill_desc) # 寫入日誌 def gettime(self): ''' 格式化時間 :return: ''' return time.strftime('%Y-%m-%d', time.localtime(time.time())) + " 星期" + str(self.day) def savedesc(self, desc): ''' 負責把選中的人寫入到log裡面 :param desc: :return: ''' with open('log.txt', 'a', encoding='utf-8') as f: f.write(self.gettime() + "\n" + desc) def savecount(self, count): ''' 負責把被罰寫的遍數寫入到log裡面 :param count: :return: ''' with open('log.txt', 'a', encoding='utf-8') as f: f.write(str(count) + '\n') f.write('--------------------------------\n') def main(self): ''' 主函數負責繪製 :return: ''' # 繪製日期、班級總人數等 now = time.strftime('%Y-%m-%d', time.localtime(time.time())) + " 星期" + str(self.day) now += "\n班級總人數:%s人" % str(len(self.data)) now += "\n正在合理計算中\n" l1 = tk.Label(self.window, fg='red', text=now, width=500, height=5) l1.config(font='Helvetica -%d bold' % 15) l1.pack() # 安置標籤 # 繪製篩選信息 l2 = tk.Label(self.window, fg='red', textvariable=self.text, width=500, height=3) l2.config(font='Helvetica -%d bold' % 30) l2.pack() # 繪製懲罰信息 l3 = tk.Label(self.window, fg='red', textvariable=self.count, width=500, height=3) l3.config(font='Helvetica -%d bold' % 20) l3.pack() # 繪製篩選按鈕 btntake = tk.Button(self.window, text="篩選", width=15, height=2, command=self.take) btntake.pack() # 繪製懲罰按鈕 btnkill = tk.Button(self.window, text="懲罰", width=15, height=2, command=self.kill) btnkill.pack() # 進入循環 self.window.mainloop() if __name__ == '__main__': loveyou = LoveYou() loveyou.main()

如果你對Python編程感興趣,那麼記得私信小編“007”領取全套Python資料哦。