本文同步發表於我的微信公眾號,掃一掃文章底部的二維碼或在微信搜尋 極客導航 即可關注,每個工作日都有文章更新。
一、概況
我們的三維世界並不能像四維世界那樣,時間是可以隨意控制的。時間過去就真的過去了,不得不說句時間過的有點快啊,高中一些片段的記憶還有時會浮現在腦海中。在高中課堂上,有的同學希望老師多提問一下自己,而有的同學在底下卻默默祈禱,希望別提問他,甚至有的同學認為老師提問他是跟他過不去。現在回頭想想,不知道會不會罵自己一句"鯊掉"。 那我們今天用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()
複製程式碼
八、總結
此程式主要為了學習GUI程式設計,此功能可能還不太完善。大家如果有興趣,可以順著此思路寫一個更好的程式,讓每位同學都愛上被提問。當你獨立工作的時候,你可能會說:老師再提問我一次吧!
歡迎關注我的公眾號,我們一起學習。