刷抖音的时候发现一个老师在用的课堂点名系统。用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">'遍历次数:', 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">'无数据')
</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">'子线程调用'<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">'应用初始化信息'<span class="hljs-string">''
<span class="hljs-keyword">self.setWindowTitle(<span class="hljs-string">'课堂点名系统 公众号:[Python 集中营]')
<span class="hljs-keyword">self.setWindowIcon(QIcon(<span class="hljs-string">'课堂点名.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">'姓名信息布局'<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">'随机点名啦')
<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">'开始信息布局'<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">'开始点名')
<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">'数据信息布局'<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">'信息提示 | 公众号:[Python 集中营]')
<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">'导入数据')
<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">'整体布局'<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">'开始点名':
<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">'开始点名')
<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">'就是你了')
<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">'选择文件', 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">'信息提示 | 成功导入[' + str(len(<span class="hljs-keyword">self.data_list)) + <span class="hljs-string">']条人员信息')
</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 [延时毫秒数] 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
- 安装
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 -)"
- 验证
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插件
- 安装
cd ~/.pyenv/plugins
git clone https://github.com/pyenv/pyenv-virtualenv.git # 安装virtualenv插件
- 配置
eval "$(pyenv virtualenv-init -)"
- 使用
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安装及使用教程