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

〆 小源。發表於2019-03-17

本文同步發表於我的微信公眾號,掃一掃文章底部的二維碼或在微信搜尋 極客導航 即可關注,每個工作日都有文章更新。

一、概況

我們的三維世界並不能像四維世界那樣,時間是可以隨意控制的。時間過去就真的過去了,不得不說句時間過的有點快啊,高中一些片段的記憶還有時會浮現在腦海中。在高中課堂上,有的同學希望老師多提問一下自己,而有的同學在底下卻默默祈禱,希望別提問他,甚至有的同學認為老師提問他是跟他過不去。現在回頭想想,不知道會不會罵自己一句"鯊掉"。 那我們今天用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程式設計,此功能可能還不太完善。大家如果有興趣,可以順著此思路寫一個更好的程式,讓每位同學都愛上被提問。當你獨立工作的時候,你可能會說:老師再提問我一次吧

歡迎關注我的公眾號,我們一起學習。

在這裡插入圖片描述

相關文章