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()
Python課堂點名器,媽媽再也不會擔心我被老師點名了

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

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

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

通過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() # 屏幕更新

下面是動態圖展示:

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

五、懲罰實現

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

 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() # 屏幕更新

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

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

六、日誌實現

日誌主要為了記錄提問的人、什麼時候提問的、罰寫的遍數。我們都要把這些信息寫入到本地,要不第二天老師忘記考誰了,學生也不承認提問我了,所以日誌功能是必須的。 當最終提問人確定的時候調用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')

本地文件格式如下:

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

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

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

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

全部代碼: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資料哦。

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


分享到:


相關文章: