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

刷抖音的时候发现一个老师在用的课堂点名系统。用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写起来很简单

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/814984/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球