刷抖音的时候发现一个老师在用的课堂点名系统。用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写起来很简单
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/814984/
转载文章受原作者版权保护。转载请注明原作者出处!