Python开发抖音同款课堂点名系统,PyQt5写起来很简单

Python74

刷抖音的时候发现一个老师在用的课堂点名系统。用PyQt5实现了一下同款,导入学生姓名,测试了一下完美运行。

【阅读全文】

操作效果展示:

完整源代码块还是放在了文章的最后面,有需要直接运行到文末获取下载方式就好了。

使用的时候准备好学生姓名的文件,使用导入数据的按钮直接导入就可以开始点名了。新建一个文本文档,将姓名设置设置好,姓名文件示例如下。

干货主要有:

① 200 多本 Python 电子书(和经典的书籍)应该有

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且可靠的练手项目及源码)

④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

Python学习交流Q群101677771

使用系统库或者第三方库都比较常规,这里就不一一介绍了。

from <span class="hljs-type">PyQt5.<span class="hljs-type">QtWidgets <span class="hljs-keyword">import *
from <span class="hljs-type">PyQt5.<span class="hljs-type">QtGui <span class="hljs-keyword">import *
from <span class="hljs-type">PyQt5.<span class="hljs-type">QtCore <span class="hljs-keyword">import *

from qdarkstyle <span class="hljs-keyword">import load_stylesheet_pyqt5

<span class="hljs-keyword">import os
<span class="hljs-keyword">import sys
<span class="hljs-keyword">import time
<span class="hljs-keyword">import random
</span></span></span></span></span></span></span></span></span></span></span></span></span></span>

为了和UI界面的主线程分离开来,我们采用的还是QThread多线程的方式来实现随机点名模块的。这样做的目的是为了防止主线程阻塞,下面是子线程的实现部分。

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">WorkThread(<span class="hljs-title">QThread):
    trigger = pyqtSignal(str)
    finished = pyqtSignal(bool)

    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">__init__<span class="hljs-params">(<span class="hljs-keyword">self, parent=None):
        <span class="hljs-keyword">super(WorkThread, <span class="hljs-keyword">self).__init_<span class="hljs-number">_(parent)
        <span class="hljs-keyword">self.parent = parent
        <span class="hljs-keyword">self.working = True

    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">__del__<span class="hljs-params">(<span class="hljs-keyword">self):
        <span class="hljs-keyword">self.working = False
        <span class="hljs-keyword">self.wait()

    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">run<span class="hljs-params">(<span class="hljs-keyword">self):
        data_list = <span class="hljs-keyword">self.parent.data_list
        <span class="hljs-keyword">if len(data_list) >= <span class="hljs-number">1:
            ran = random.randint(<span class="hljs-number">20, <span class="hljs-number">40)
            print(<span class="hljs-string">'&#x904D;&#x5386;&#x6B21;&#x6570;&#xFF1A;', ran)
            <span class="hljs-keyword">for a <span class="hljs-keyword">in range(ran):
                name = random.choice(data_list)
                <span class="hljs-keyword">self.trigger.emit(name)
                print(name)
                time.sleep(<span class="hljs-number">0.<span class="hljs-number">6)
            <span class="hljs-keyword">self.finished.emit(True)
        <span class="hljs-symbol">else:
            <span class="hljs-keyword">self.trigger.emit(<span class="hljs-string">'&#x65E0;&#x6570;&#x636E;')
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

UI 界面的实现部分也比较常规,下面主要实现部分的代码块。

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">ClassCollSystem(<span class="hljs-title">QWidget):
    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">__init__<span class="hljs-params">(<span class="hljs-keyword">self):
        <span class="hljs-keyword">super(ClassCollSystem, <span class="hljs-keyword">self).__init_<span class="hljs-number">_()
        <span class="hljs-keyword">self.data_list = []
        <span class="hljs-keyword">self.init_ui()

    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">init_ui<span class="hljs-params">(<span class="hljs-keyword">self):
        <span class="hljs-string">''<span class="hljs-string">'&#x5B50;&#x7EBF;&#x7A0B;&#x8C03;&#x7528;'<span class="hljs-string">''
        <span class="hljs-keyword">self.thread<span class="hljs-number">_ = WorkThread(<span class="hljs-keyword">self)
        <span class="hljs-keyword">self.thread<span class="hljs-number">_.trigger.connect(<span class="hljs-keyword">self.set_name)
        <span class="hljs-keyword">self.thread<span class="hljs-number">_.finished.connect(<span class="hljs-keyword">self.finished)

        <span class="hljs-string">''<span class="hljs-string">'&#x5E94;&#x7528;&#x521D;&#x59CB;&#x5316;&#x4FE1;&#x606F;'<span class="hljs-string">''
        <span class="hljs-keyword">self.setWindowTitle(<span class="hljs-string">'&#x8BFE;&#x5802;&#x70B9;&#x540D;&#x7CFB;&#x7EDF;  &#x516C;&#x4F17;&#x53F7;&#xFF1A;[Python &#x96C6;&#x4E2D;&#x8425;]')
        <span class="hljs-keyword">self.setWindowIcon(QIcon(<span class="hljs-string">'&#x8BFE;&#x5802;&#x70B9;&#x540D;.ico'))
        <span class="hljs-keyword">self.setFixedSize(<span class="hljs-number">500, <span class="hljs-number">350)

        <span class="hljs-string">''<span class="hljs-string">'&#x59D3;&#x540D;&#x4FE1;&#x606F;&#x5E03;&#x5C40;'<span class="hljs-string">''
        vbox_name = QVBoxLayout()
        <span class="hljs-keyword">self.current_name = QLabel()
        <span class="hljs-keyword">self.current_name.setText(<span class="hljs-string">'&#x968F;&#x673A;&#x70B9;&#x540D;&#x5566;')
        <span class="hljs-keyword">self.current_name.setStyleSheet(
            <span class="hljs-string">'font-size:50px;text-align:center;font-weight:bold;font-family:"Microsoft JhengHei";')

        vbox_name.addWidget(<span class="hljs-keyword">self.current_name)
        vbox_name.setAlignment(Qt.AlignCenter)

        <span class="hljs-string">''<span class="hljs-string">'&#x5F00;&#x59CB;&#x4FE1;&#x606F;&#x5E03;&#x5C40;'<span class="hljs-string">''
        vbox_start = QVBoxLayout()
        <span class="hljs-keyword">self.start_btn = QPushButton()
        <span class="hljs-keyword">self.start_btn.setText(<span class="hljs-string">'&#x5F00;&#x59CB;&#x70B9;&#x540D;')
        <span class="hljs-keyword">self.start_btn.setFixedSize(<span class="hljs-number">160, <span class="hljs-number">50)
        <span class="hljs-keyword">self.start_btn.setStyleSheet(
            <span class="hljs-string">'font-size:30px;font-weight:bold;text-align:center;font-family:"Microsoft JhengHei";')
        <span class="hljs-keyword">self.start_btn.clicked.connect(<span class="hljs-keyword">self.start_btn_click)

        vbox_start.addWidget(<span class="hljs-keyword">self.start_btn)
        vbox_start.setAlignment(Qt.AlignCenter)
        vbox_start.addSpacing(<span class="hljs-number">80)

        <span class="hljs-string">''<span class="hljs-string">'&#x6570;&#x636E;&#x4FE1;&#x606F;&#x5E03;&#x5C40;'<span class="hljs-string">''
        vbox_data = QHBoxLayout()
        <span class="hljs-keyword">self.message = QLabel()
        <span class="hljs-keyword">self.message.setText(<span class="hljs-string">'&#x4FE1;&#x606F;&#x63D0;&#x793A; | &#x516C;&#x4F17;&#x53F7;&#xFF1A;[Python &#x96C6;&#x4E2D;&#x8425;]')
        <span class="hljs-keyword">self.message.setStyleSheet(
            <span class="hljs-string">'font-size:12px;')

        <span class="hljs-keyword">self.import_btn = QPushButton()
        <span class="hljs-keyword">self.import_btn.setText(<span class="hljs-string">'&#x5BFC;&#x5165;&#x6570;&#x636E;')
        <span class="hljs-keyword">self.import_btn.setFixedSize(<span class="hljs-number">90, <span class="hljs-number">25)
        <span class="hljs-keyword">self.import_btn.clicked.connect(<span class="hljs-keyword">self.import_btn_click)

        vbox_data.addWidget(<span class="hljs-keyword">self.message)
        vbox_data.addStretch(<span class="hljs-number">1)
        vbox_data.addWidget(<span class="hljs-keyword">self.import_btn)

        <span class="hljs-string">''<span class="hljs-string">'&#x6574;&#x4F53;&#x5E03;&#x5C40;'<span class="hljs-string">''
        vbox = QVBoxLayout()
        vbox.addLayout(vbox_name)
        vbox.addLayout(vbox_start)
        vbox.addLayout(vbox_data)

        <span class="hljs-keyword">self.setLayout(vbox)

    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">start_btn_click<span class="hljs-params">(<span class="hljs-keyword">self):
        <span class="hljs-keyword">if <span class="hljs-keyword">self.start_btn.text().strip() == <span class="hljs-string">'&#x5F00;&#x59CB;&#x70B9;&#x540D;':
            <span class="hljs-keyword">self.thread<span class="hljs-number">_.start()
        <span class="hljs-symbol">else:
            <span class="hljs-keyword">self.start_btn.setText(<span class="hljs-string">'&#x5F00;&#x59CB;&#x70B9;&#x540D;')

    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">set_name<span class="hljs-params">(<span class="hljs-keyword">self, name):
        <span class="hljs-keyword">self.current_name.setText(name)

    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">finished<span class="hljs-params">(<span class="hljs-keyword">self, finished):
        <span class="hljs-keyword">if finished is <span class="hljs-symbol">True:
            <span class="hljs-keyword">self.start_btn.setText(<span class="hljs-string">'&#x5C31;&#x662F;&#x4F60;&#x4E86;')

    <span class="hljs-function"><span class="hljs-keyword">def <span class="hljs-title">import_btn_click<span class="hljs-params">(<span class="hljs-keyword">self):
        file = QFileDialog.getOpenFileName(<span class="hljs-keyword">self, <span class="hljs-string">'&#x9009;&#x62E9;&#x6587;&#x4EF6;', os.getcwd(), <span class="hljs-string">'Text File(*.txt)')
        file_path = file[<span class="hljs-number">0]
        print(file_path)
        fl = open(str(file_path), <span class="hljs-string">'r', encoding=<span class="hljs-string">'utf-8')
        <span class="hljs-keyword">self.data_list = fl.read().strip().split(<span class="hljs-string">'n')
        print(<span class="hljs-keyword">self.data_list)
        <span class="hljs-keyword">self.message.setText(<span class="hljs-string">'&#x4FE1;&#x606F;&#x63D0;&#x793A; | &#x6210;&#x529F;&#x5BFC;&#x5165;[' + str(len(<span class="hljs-keyword">self.data_list)) + <span class="hljs-string">']&#x6761;&#x4EBA;&#x5458;&#x4FE1;&#x606F;')
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

最后,将主页面加入主体循环直接运行可以了。

Original: https://www.cnblogs.com/sn5200/p/15885982.html
Author: Python可乐的呀
Title: Python开发抖音同款课堂点名系统,PyQt5写起来很简单



相关阅读1

Title: 懂事的电脑就应该自觉工作,每天自动开机、联网、睡眠、醒来……

背景描述

办公室电脑,工作需要远程控制,如何实现有很多方案,不赘述,我用的是frp加密转发。

但是遇到停电、断网等情况,如何自动恢复(单位使用了锐捷认证系统)?

另外,一天24小时开着又太浪费,只需要某些时候接受可能的远程遥控。

在此情况下,我需要自动开机、自动联网、定时睡眠、定时唤醒。

分项加以说明,重点是计划任务的设置,以及睡眠醒来的事件ID。

自动开机

这是最好处理的,BIOS设置定时开机即可。每天还是每周,都按自己意愿设定。

将电源设置为恢复到上次的情况,如果停电,则来电自动开机,是我主动关机,则到了设定时间才自动开机。

自动联网

勾选锐捷认证软件的记住密码、自动登录和开机自启选项,将锐捷服务(rj supplicant service)设置成自动启动。

从睡眠中醒来后能否自动登录联网,另见后面章节。

定时睡眠

定时执行操作,无需任何第三方软件,Windows自带的 计划任务就很好了,还可以把许多不必要的任务关闭。

睡眠命令是怎样呢?网上搜索有若干结果,不外是以下几种,大多都不确切。

rundll32.exe powrprof.dll,SetSuspendState 0,1,0

shutdown -h

它们的功能都一样,执行系统休眠,如果关闭了 休眠功能(比如命令用powercfg -h off),则进入 睡眠状态。

如果不想关闭 休眠功能又不想编程让电脑按指令 睡眠,目前感觉 nircmd最强大稳定。

nircmd.exe cmdwait [&#x5EF6;&#x65F6;&#x6BEB;&#x79D2;&#x6570;] standby

中间的cmdwait [延时毫秒数]这一节,看自己需求,可以不要

进入睡眠只是它若干功能之九牛一毛,相当好用!

定时唤醒

同样也是使用 计划任务来完成,与普通的任务相比,需要勾选"条件"选项卡中的" 唤醒计算机运行此任务"。

实验表明,任务运行完成后,发现没有键鼠动作,计算机又倒头睡着了......

所以,这个任务不能太简单,太复杂则浪费计算机性能。

其实随便运行一个不会自动结束、也不会重复打开多个副本的软件就行。

我编写了一个小脚本,每分钟ping一下网关,循环8个小时,或直到下次此计划任务启动。✌️

联网简单,运行认证软件即可,但是"醒来"这个时机如何把握?

计划任务中,触发器,发生事件时。

查了若干资料,计划任务中,有方法定位到计算机醒来的事件。

主要有这么几种:

Windows-Kernel-Power with event ID 42
Windows-Power-Troubleshooter with event ID 1
Windows-Kernel-General with ID 1

经实验,对不同的系统(Win7/Win10/Win11)有不同的效果,都加进去更保险。

其它问题

事后再想想,醒来联网是不是搞复杂了?

把联网认证的命令写到唤醒脚本的第一行应该就可以了。

系统换成Windows11后发现又有问题了,无法唤醒,查了半天,原来电源管理中" 混合睡眠"需要关闭才可以使定时唤醒生效。

Original: https://www.cnblogs.com/repus/p/16223904.html
Author: supervisor
Title: 懂事的电脑就应该自觉工作,每天自动开机、联网、睡眠、醒来……

相关阅读2

Title: pyenv安装及使用教程

pyenv安装及使用教程

pyenv

  1. 安装
    git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# 编辑 bashrc
vim ~/.bashrc

# 文件最后添加
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export PATH="$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init -)"

  1. 验证
    pyenv --version
    常用命令
# 基本使用
pyenv --version  # 查看 pyenv 的版本
pyenv versions  # 罗列当前已安装的所有 python 环境,如果是当前正在使用的环境,则前面会有个 *
pyenv help    # 查看帮助
pyenv init    # 如果输入 pyenv 之后使用 tab 不补全,可以使用该命令进行初始即可使用补全命令

# 安装环境
pyenv install -l      # 显示可以安装的版本列表
pyenv install 版本号   # 安装指定版本的 python
pyenv rehash     # 更新本地数据库,安装指定版本的 python 后使用

# 环境应用
pyenv global 版本号     # 更改本机版本,重启不会造成再次更改
pyenv local 版本号 # 会在当前目录创建 .python-version 文件,并记录设置的 python 环境,每次进入该目录会自动设置成该 python 环境
pyenv shell 版本号 # 更改当前 shell 下使用的 python 版本,临时生效,优先级高于 global

virtualenv插件

  1. 安装
cd ~/.pyenv/plugins
git clone https://github.com/pyenv/pyenv-virtualenv.git  # 安装virtualenv插件
  1. 配置
eval "$(pyenv virtualenv-init -)"
  1. 使用
pyenv virtualenv 3.6.5 env  创建 3.6.5 版本虚拟环境
pyenv virtualenvs   显示环境
pyenv activate env  激活使用指定的虚拟环境
pyenv deactivate    退出当前虚拟环境
rm -rf .pyenv/versions/3.6.5    删除版本环境
rm -rf .pyenv/versions/env  删除虚拟环境

自动激活和退出虚拟环境

在需要使用虚拟环境的目录(通常是项目目录)中:

建立一个 .python-version 的文本文件
将虚拟环境名称(如 env )写在里面
之后每次进/出该目录时,虚拟环境都将自动激活/退出。

Original: https://www.cnblogs.com/Free-A/p/16158370.html
Author: Free_A
Title: pyenv安装及使用教程

相关阅读3