社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python课堂点名器,妈妈再也不会担心我被老师点名了

〆 小源。 • 6 年前 • 345 次点击  
阅读 62

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()

复制代码

八、总结

此程序主要为了学习GUI编程,此功能可能还不太完善。大家如果有兴趣,可以顺着此思路写一个更好的程序,让每位同学都爱上被提问。当你独立工作的时候,你可能会说:老师再提问我一次吧

欢迎关注我的公众号,我们一起学习。

在这里插入图片描述

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29942
 
345 次点击