一起用Python做个上课点名器的制作过程

目录
  • 前言
  • 一、核心功能设计
  • 二、实现步骤
    • 1. UI排版布局设计
    • 2. 学生姓名加载
    • 3. 随机点名实现
    • 4. 连抽模式实现
    • 5. 抽取历史查看
    • 4. 打包配置

前言

前段时间,用PyQt5写了几篇文章,关于Python自制一款炫酷音乐播放器、自定义动态壁纸、车牌自动识别系统。今天就继续给大家分享一个读者粉丝投稿的,关于上课点名的实战案例,一起来看看是如何实现的吧!

首先我们还是一起先来看看点名器实现的效果:

下面,我们开始介绍这款点名器的制作过程。

获取源码及exe打包程序,点击下载

一、核心功能设计

总体来说,我们这款点名器实现的思路大致是,可以自定义设置班级学生姓名或者默认通过学号进行学生随机点名抽取,可以每次单人抽取也可以自己选择连抽人数进行多人连抽,并将这些随机抽取的学生姓名历史数据显示。

拆解需求,接下来我们可以通过以下几步进行实现:

  • UI排版布局设计,确认点名器的各个功能设计
  • 读取班级学生的姓名文件,将各个学生的姓名加载到列表中,如果没有学生姓名文件默认创建学号文件
  • 实现对学生姓名的随机点名抽取功能
  • 实现多人连抽模式
  • 查看随机抽取的学生姓名历史数据

二、实现步骤

之前有读者反馈说,不知道程序中具体需要哪些模块、包文件,下面我就把程序中用到模块先放出来。主要包括了文件读写,随机数,PyQt5,win32con等。

import sys,os
from random import randint
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import *
from win32api import MessageBox
from win32con import MB_OK, MB_ICONWARNING

1. UI排版布局设计

根据点名器所需要的功能,首先我们可以进行UI布局设计,我们这次还是使用的pyqt5。主要包含了姓名的随机抽取显示功能、连抽模式的随机抽取显示、抽取历史结果的查看功能、姓名文件的读取显示等。核心设计代码如下:

# author:Dragon少年
def setupUi(self, MainWindow):
    #以下课直接粘贴生成的setupui代码
    MainWindow.setObjectName("点名器")
    MainWindow.resize(420, 360)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.label = QtWidgets.QLabel(self.centralwidget)
    self.label.setGeometry(QtCore.QRect(55, 50, 331, 71))
    font = QtGui.QFont()
    font.setFamily("宋体")
    font.setPointSize(50)
    self.label.setFont(font)
    self.label.setObjectName("label")
    self.pushButton = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton.setGeometry(QtCore.QRect(55, 190, 111, 61))
    font = QtGui.QFont()
    font.setFamily("宋体")
    font.setPointSize(20)
    self.pushButton.setFont(font)
    self.pushButton.setObjectName("pushButton")
    self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_2.setGeometry(QtCore.QRect(253, 190, 111, 61))
    font = QtGui.QFont()
    font.setFamily("宋体")
    font.setPointSize(20)
    self.pushButton_2.setFont(font)
    self.pushButton_2.setObjectName("pushButton_2")
    self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_3.setGeometry(QtCore.QRect(11, 570, 111, 41))
    self.pushButton_3.setObjectName("pushButton_3")
    self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_4.setGeometry(QtCore.QRect(0, 830, 111, 41))
    self.pushButton_4.setObjectName("pushButton_4")
    self.listWidget = QtWidgets.QListWidget(self.centralwidget)
    self.listWidget.setGeometry(QtCore.QRect(11, 370, 397, 191))
    self.listWidget.setObjectName("listWidget")
    self.label_2 = QtWidgets.QLabel(self.centralwidget)
    self.label_2.setGeometry(QtCore.QRect(11, 340, 210, 21))
    self.label_2.setObjectName("label_2")
    self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_5.setGeometry(QtCore.QRect(11, 303, 111, 20))
    self.pushButton_5.setObjectName("pushButton_5")
    self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_6.setGeometry(QtCore.QRect(319, 300, 75, 20))
    self.pushButton_6.setObjectName("pushButton_6")
    self.label_3 = QtWidgets.QLabel(self.centralwidget)
    self.label_3.setGeometry(QtCore.QRect(495, 260, 56, 21))
    self.label_3.setObjectName("label_3")
    self.label_3.setStyleSheet('color:white;background:#222225')
    self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_7.setGeometry(QtCore.QRect(649, 240, 111, 61))
    font = QtGui.QFont()
    font.setFamily("宋体")
    font.setPointSize(30)
    self.pushButton_7.setFont(font)
    self.pushButton_7.setObjectName("pushButton_7")
    self.listWidget_2 = QtWidgets.QListWidget(self.centralwidget)
    self.listWidget_2.setGeometry(QtCore.QRect(473, 20, 353, 221))
    font = QtGui.QFont()
    font.setPointSize(14)
    self.listWidget_2.setFont(font)
    self.listWidget_2.setFocusPolicy(QtCore.Qt.WheelFocus)
    self.listWidget_2.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
    self.listWidget_2.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)        self.listWidget_2.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
    self.listWidget_2.setObjectName("listWidget_2")
    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 874, 23))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)
    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)
    self.pushButton.clicked.connect(self.start)
    self.pushButton_2.clicked.connect(self.stop)
    self.pushButton_5.clicked.connect(self.showHistory)
    self.pushButton_6.clicked.connect(self.showContinue)
    self.pushButton_7.clicked.connect(self.ten)
    self.listWidget.setStyleSheet(self.scc)
    self.listWidget_2.setStyleSheet(self.scc)
    MainWindow.setWindowOpacity(0.95)  # 设置窗口透明度
    MainWindow.setAttribute(Qt.WA_TranslucentBackground)
    MainWindow.setWindowFlag(Qt.FramelessWindowHint)  # 隐藏边框

    self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_8.setGeometry(QtCore.QRect(132, 570, 100, 41))
    self.pushButton_8.setObjectName("pushButton_8")
    self.pushButton_8.clicked.connect(self.rename)
    self.pushButton_8.setText('重置名字文件')

# author:Dragon少年
def retranslateUi(self, MainWindow):
    self.wide = 420
    self.high = 360
    _translate = QtCore.QCoreApplication.translate
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    self.label.setText(_translate("MainWindow", "恭喜{}号"))
    self.label.setStyleSheet('color:white')
    self.pushButton.setText(_translate("MainWindow", "开始"))
    self.pushButton_2.setText(_translate("MainWindow", "结束"))
    self.pushButton_3.setText(_translate("MainWindow", "打开名字文件"))
    self.pushButton_4.setText(_translate("MainWindow", "开gua选项"))
    self.label_2.setText(_translate("MainWindow", "点过的学号/姓名:"))
    self.pushButton_5.setText(_translate("MainWindow", "查看点过的名字"))
    self.pushButton_6.setText(_translate("MainWindow", "连抽模式"))
    self.label_3.setText(_translate("MainWindow", "连抽人数"))
    self.pushButton_7.setText(_translate("MainWindow", "开始"))

UI实现效果如下:

对于这个点名器界面,之前有读者粉丝私信我,如何实现将某些内容显示及隐藏动态控制,今天我们就通过这个点名器进行演示实现。

例如对于这个点名器,我们想默认情况下,不要显示抽取的学生历史数据,也不要显示连抽相关的内容,想让这个点名器界面更加简洁直观一些,如下图所示。

那么这个功能该如何实现呢?其实也非常简单,只要我们定义一个事件函数,通过对界面窗体的宽高进行resize重置,然后将该事件函数绑定到类似按钮点击事件上,就可以实现动态显示/隐藏部分界面内容了。核心代码如下:

# author:Dragon少年
# 点击“查看点过的名字”时,调用该函数,对界面窗体高度大小进行resize重置
def showHistory(self):
    global seed
    if not seed:
        self.high = 656
        MainWindow.resize(self.wide,self.high)
        seed = True
    else:
        self.high = 360
        MainWindow.resize(self.wide, self.high)
        seed = False

# 点击“连抽模式”时,调用该函数,对界面窗体宽度大小进行resize重置
def showContinue(self):
    global choud
    if not choud:
        self.wide = 874
        MainWindow.resize(self.wide, self.high)
        choud = True
    else:
        self.wide = 420
        MainWindow.resize(self.wide, self.high)
        choud = False

UI布局设计完成,下面我们开始进行班级学生姓名的读取加载。

2. 学生姓名加载

接下来我们需要对要随机点名抽取的学生姓名进行加载放到一个列表中,这里我们需要注意是否有name.txt文件,如果有可以直接读取加载姓名数据,如果没有该文件,则需要默认根据数字进行学号文件创建。核心代码如下:

# author:Dragon少年
def name():
    with open('name.txt', 'w') as f:
        print(f.truncate())
        print(f.write(a))

try:
    wordlist3 = []
    with open('name.txt', encoding='utf8') as f:
        for line in f.readlines():
            wordlist3.append(line.strip('\n'))  # strip('\n')去掉字符串中的'\n'
    print(wordlist3)
    name_list = wordlist3
except:
    name()
    MessageBox(0, "请及时修改当前目录下name文件,默认将为1-52", "MessageBox", MB_OK | MB_ICONWARNING)
    name_list = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18',
                 '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35',
                 '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', ]

3. 随机点名实现

随机点名我们可以设计两个按钮,分别来控制开始抽取和停止抽取功能,通过定时器来进行学生姓名列表数据的随机抽取,从而实现随机点名的功能。核心代码如下:

# author:Dragon少年
# 对姓名列表进行随机显示 模拟随机点名功能
def setname(self):
    global running
    global name
    try:
        name = name_list[randint(0, len(name_list) - 1)]
        self.label.setText("恭喜{}号!!!".format(name))
    except:
        self.name()
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'发生错误,请检查name文件的学号后再重新打开本软件', QtWidgets.QMessageBox.Yes)
        sys.exit()

# 开始按钮绑定 通过定时器加载随机点名函数
def start(self):
    global running
    if running:
        print('running')
        pass
    else:
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.setname)
        self.timer.start(50)
        running = 'True'

# 结束按钮绑定 控制定时器停止
def stop(self):
    global running, a
    if running:
        self.timer.stop()
        running = False
        self.listWidget.addItem(name)
    else:
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'还没开始就想结束?', QtWidgets.QMessageBox.Yes)

至此,我们已经可以实现点名功能了,如下所示。

4. 连抽模式实现

随机抽取功能已经实现了,多人连抽和随机抽取类似,只要进行姓名列表随机抽取对应人数就可以了。当然对抽取人数的输入,我们需要进行一些输入限制,避免一些异常输入情况,例如输入非数字、输入负数、输入数字过大等。我们只要将连抽函数同样绑定到按钮上就可以了。核心代码如下:

# author:Dragon少年
def ten(self):
    num = self.lineEdit.text()
    print (num)
    num = int(num)
    if not num =='' and not num<=0 and not num>1000:
        if num > 20:
            reply = QtWidgets.QMessageBox.warning(self, u'警告', u'认真的吗,这么多', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()
        for i in range (0,int(num)):
            name = name_list[randint(0, len(name_list) - 1)]
            self.listWidget_2.addItem(name)
            self.listWidget.addItem(name)
    elif num =='':
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'请输入数字', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()
    elif num<0:
        #win32api.MessageBox(0, "你见过负数个人么???????", "通知", win32con.MB_OK | win32con.MB_ICONWARNING)
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'人数负数,输入有误!', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()
    elif num==0:
        #win32api.MessageBox(0, "人都被你吃了???", "通知", win32con.MB_OK | win32con.MB_ICONWARNING)
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'人数为0,输入有误!', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()
    elif num>1000:
        #win32api.MessageBox(0, "这么大?要不起~", "通知", win32con.MB_OK | win32con.MB_ICONWARNING)
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'人数超出限制,输入有误!', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()

5. 抽取历史查看

我们最后再实现一个对点名的学生姓名进行历史数据显示查看功能。该功能实现也很简单,只要对上面随机抽取的姓名添加到对应的历史列表框中就可以了;还可以对学生姓名文件进行重置等功能。核心代码如下:

# author:Dragon少年
def rename(self):
     reply = QtWidgets.QMessageBox.question(self, u'警告', u'确定重置name文件为1-52?', QtWidgets.QMessageBox.Yes,
                                            QtWidgets.QMessageBox.No)
     if reply == QtWidgets.QMessageBox.Yes:
         with open('name.txt', 'w') as f:
             print(f.truncate())
             print(f.write(a))
         MessageBox(0, "重置完成,", "通知", MB_OK | MB_ICONWARNING)
     else:
         pass

至此,这款点名器就完成了, 一起来看看效果吧!

4. 打包配置

最近有好几个粉丝问我,Python能不能打包成exe?如何打包呢?之前已经介绍过了,今天就通过这个再来来一起介绍下。

Python常用的打包工具是第三方库Pyinstaller,需要安装下pyinstaller。

pip install Pyinstaller

接下来,我们需要打开命令窗口,切换到项目目录下再执行打包命令。

pyinstaller -F -i ./img.ico 点名.py

打包常用的参数如下:

  • -F 表示生成单个可执行文件
  • -p 表示你自己自定义需要加载的类路径,一般情况下用不到
  • -i 表示可执行文件的图标
  • -w 表示去掉控制台窗口,这在GUI界面时非常有用

之前有小伙伴问我,打包的图标需要.ico后缀的图片,应该如何把普通图片转成图标格式.ico呢?Python也可以帮你实现图片转.ico文件。核心代码如下:

import PythonMagick

# 生成图标ico(png格式图片转成ico)
img = PythonMagick.Image('./image/img1/1.png')
# 这里要设置一下尺寸,不然会报ico尺寸异常错误
img.sample('128x128')
img.write('./img.ico')

到此这篇关于一起用Python做个上课点名器的文章就介绍到这了,更多相关Python上课点名器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python用tkinter实现一个简易能进行随机点名的界面

    今天学到Python 有一个名为 random 的内置模块,可用于生成随机数, 这个好玩~可以用来做为上课随机点名的程序了哈哈.. def main_cor(): import random i = random.randrange(0,29) with open('roll_call.txt', encoding='utf-8') as file_obj: contents = file_obj.read() stuff = contents.split(' ') s = stuff[i] s

  • python写一个随机点名软件的实例

    最近有个随机点名软件的需求,故写了一个,上代码:github地址 # -*- coding: utf-8 -*- # @Time : 18-12-31 下午4:21 # @Author : Felix Wang from tkinter import * import tkinter.font as tkFont import random import gc import os, sys import chardet import copy from threading import Thre

  • 基于python tkinter的点名小程序功能的实例代码

    代码如下所示: import datetime import json import os import random import tkinter as tk import openpyxl # 花名册文件名 excel_file_path = "花名册.xlsx"#需在当前目录创建对应花名册.xlsx # 工作表名 excel_sheet = "Sheet1" # 记录存储文件名 file_path = "name_record.json"

  • 一起用Python做个上课点名器的制作过程

    目录 前言 一.核心功能设计 二.实现步骤 1. UI排版布局设计 2. 学生姓名加载 3. 随机点名实现 4. 连抽模式实现 5. 抽取历史查看 4. 打包配置 前言 前段时间,用PyQt5写了几篇文章,关于Python自制一款炫酷音乐播放器.自定义动态壁纸.车牌自动识别系统.今天就继续给大家分享一个读者粉丝投稿的,关于上课点名的实战案例,一起来看看是如何实现的吧! 首先我们还是一起先来看看点名器实现的效果: 下面,我们开始介绍这款点名器的制作过程. 获取源码及exe打包程序,点击下载 一.核

  • Python实现上课点名器系统

    目录 前言 一.核心功能设计 二.实现步骤 1. UI排版布局设计 2. 学生姓名加载 3. 随机点名实现 4. 连抽模式实现 5. 抽取历史查看 三. 打包配置 总结 前言 前段时间,用PyQt5写了几篇文章,关于Python自制一款炫酷音乐播放器.自定义动态壁纸.车牌自动识别系统.今天就继续给大家分享一个读者粉丝投稿的,关于上课点名的实战案例,一起来看看是如何实现的吧! 首先我们还是一起先来看看点名器实现的效果: 下面,我们开始介绍这款点名器的制作过程. 直接跳到文末获取源码及exe打包程序

  • 详细过程带你用Python做车牌自动识别系统

    目录 前言 一.核心功能设计 UI设计排版布局 车牌识别 车牌信息显示存储 二.实现步骤 1. UI设计排版布局 2. 车牌识别 3. 车牌信息显示存储 3.1 车牌信息显示: 3.2 信息导出存储: 前言 前段时间,用PyQt5写了两篇文章,自己用python做的一款超炫酷音乐播放器.用Python做个个性的动画挂件让桌面不单调.有粉丝问我,为什么要用PyQt5?之前没接触过PyQt5,能不能多分享一些这方面的开发案例? 今天就继续给大家分享一个实战案例,带大家一起用Python的PyQt5开

  • 用Python做个个性的动画挂件让桌面不单调

    目录 前言 一.核心功能设计 二.实现步骤 1. 解析提取,修改图片 2.初始化动画挂件 3.动画挂件功能实现 4.打包配置 前言 前段时间,写了篇博客自己用python做的一款超炫酷音乐播放器.有粉丝问我,音乐播放器为什么要用PyQt5,效果是不是比Tkinter赞?PyQt5真的可以实现这些炫酷的UI画面吗?之前没接触过PyQt5,能不能多分享一些这方面的开发案例? 今天就带大家,一起用Python的PyQt5开发一个有趣的自定义桌面动画挂件,看看实现的动画挂件效果! 下面,我们开始介绍这个

  • 自己用python做的一款超炫酷音乐播放器

    目录 前言 一.核心功能设计 UI设计排版布局 关键字音乐列表爬虫 音乐播放 附加功能 二.实现步骤 1. UI设计排版布局 2. 关键字音乐列表爬虫 3. 音乐播放 4. 附加功能 三.结束语 前言 晚上坐在电脑面前,想着一边撸代码,一边听音乐.搜了搜自己想听的歌,奈何好多歌曲都提示需要版权,无法播放! 没办法,想听歌还是得靠自己解决!今天就一起用python自制一款炫酷的音乐播放器吧~ 首先一起来看看最终实现的音乐播放器效果: 下面,我们开始介绍这个音乐播放器的制作过程. 一.核心功能设计

  • Python做个自定义动态壁纸还可以放视频

    目录 前言 一.核心功能设计 二.实现步骤 1. UI排版布局设计 2. 视频加载预览 3. 动态壁纸功能实现 4. 关闭动态壁纸 前言 前段时间,用PyQt5写了几篇文章,关于Python自制一款炫酷音乐播放器.自定义桌面动画挂件.车牌自动识别系统.今天就继续给大家分享一个实战案例,带大家一起用Python的PyQt5开发一个自定义动态桌面壁纸,好玩又有趣! 首先一起来看看最终实现的自定义动态壁纸效果: 下 面,我们开始介绍这个自定义动态桌面的制作过程. 一.核心功能设计 总体来说,我们需要实

  • Python做文本按行去重的实现方法

    文本: 每行在promotion后面包含一些数字,如果这些数字是相同的,则认为是相同的行,对于相同的行,只保留一行. 思路: 根据字典和字符串切割. 建立一个空字典. 读入文本,并对每行切割前半部分,在读入文本的过程中循环在这个字典中查找,如果没找到,则写入该行到字典.否则,则表示该行已经被写入过字典了(即出现重复的行了),不再写入字典,这就实现了对于重复的行只保留一行的目的. 文本如下: /promotion/232 utm_source /promotion/237 LandingPage/

  • 用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信息到网络信息库之中(一般使用爬虫):然后信息整理模块对采集的信息进行分词.去停用词.赋权重等操作后建立索引表(一般是倒排索引)构成索引库:最后用户查询模块就可以识别用户的检索需求并提供检索服务啦. 图1 搜索引擎的一般结构 2. 使用python实现一个简单搜索引擎 2.1 问题分析 从图1看,一个完整的搜索

  • Python做简单的字符串匹配详解

    Python做简单的字符串匹配详解 由于需要在半结构化的文本数据中提取一些特定格式的字段.数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理.结构化数据的计算,Python具有与matlab共同的特点:语法简洁.库丰富,对算法仿真来说都是一门简洁易用的语言. Python做字符串匹配相对来说上手比较容易,且具有成熟的字符串处理库re供我们使用: 在re库的帮助下,只需简单的两步就可完成匹配工作,对做数据分析/算法的工作者来说,轻松了许多: ste

  • 不到20行代码用Python做一个智能聊天机器人

    伴随着自然语言技术和机器学习技术的发展,越来越多的有意思的自然语言小项目呈现在大家的眼前,聊天机器人就是其中最典型的应用,今天小编就带领大家用不到20行代码,运用两种方式搭建属于自己的聊天机器人. 1.神器wxpy库 首先,小编先向大家介绍一下本次运用到的python库,本次项目主要运用到的库有wxpy和chatterbot. wxpy是在 itchat库 的基础上,通过大量接口优化,让模块变得简单易用,并进行了功能上的扩展.什么是接口优化呢,简单来说就是用户直接调用函数,并输入几个参数,就可以

随机推荐