网络编程
位置:首页>> 网络编程>> Python编程>> 基于PyQT5制作一个课堂点名系统

基于PyQT5制作一个课堂点名系统

作者:Python?集中营  发布时间:2023-10-08 20:52:13 

标签:Python,PyQT5,点名系统

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

操作效果展示:

基于PyQT5制作一个课堂点名系统

完整源代码块还是放在了文章的最后面

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

基于PyQT5制作一个课堂点名系统

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

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

from qdarkstyle import load_stylesheet_pyqt5

import os
import sys
import time
import random  

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

class WorkThread(QThread):
   trigger = pyqtSignal(str)
   finished = pyqtSignal(bool)

def __init__(self, parent=None):
       super(WorkThread, self).__init__(parent)
       self.parent = parent
       self.working = True

def __del__(self):
       self.working = False
       self.wait()

def run(self):
       data_list = self.parent.data_list
       if len(data_list) >= 1:
           ran = random.randint(20, 40)
           print('遍历次数:', ran)
           for a in range(ran):
               name = random.choice(data_list)
               self.trigger.emit(name)
               print(name)
               time.sleep(0.6)
           self.finished.emit(True)
       else:
           self.trigger.emit('无数据')

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

class ClassCollSystem(QWidget):
   def __init__(self):
       super(ClassCollSystem, self).__init__()
       self.data_list = []
       self.init_ui()

def init_ui(self):
       '''子线程调用'''
       self.thread_ = WorkThread(self)
       self.thread_.trigger.connect(self.set_name)
       self.thread_.finished.connect(self.finished)

'''应用初始化信息'''
       self.setWindowTitle('课堂点名系统  公众号:[Python 集中营]')
       self.setWindowIcon(QIcon('课堂点名.ico'))
       self.setFixedSize(500, 350)

'''姓名信息布局'''
       vbox_name = QVBoxLayout()
       self.current_name = QLabel()
       self.current_name.setText('随机点名啦')
       self.current_name.setStyleSheet(
           'font-size:50px;text-align:center;font-weight:bold;font-family:"Microsoft JhengHei";')

vbox_name.addWidget(self.current_name)
       vbox_name.setAlignment(Qt.AlignCenter)

'''开始信息布局'''
       vbox_start = QVBoxLayout()
       self.start_btn = QPushButton()
       self.start_btn.setText('开始点名')
       self.start_btn.setFixedSize(160, 50)
       self.start_btn.setStyleSheet(
           'font-size:30px;font-weight:bold;text-align:center;font-family:"Microsoft JhengHei";')
       self.start_btn.clicked.connect(self.start_btn_click)

vbox_start.addWidget(self.start_btn)
       vbox_start.setAlignment(Qt.AlignCenter)
       vbox_start.addSpacing(80)

'''数据信息布局'''
       vbox_data = QHBoxLayout()
       self.message = QLabel()
       self.message.setText('信息提示 | 公众号:[Python 集中营]')
       self.message.setStyleSheet(
           'font-size:12px;')

self.import_btn = QPushButton()
       self.import_btn.setText('导入数据')
       self.import_btn.setFixedSize(90, 25)
       self.import_btn.clicked.connect(self.import_btn_click)

vbox_data.addWidget(self.message)
       vbox_data.addStretch(1)
       vbox_data.addWidget(self.import_btn)

'''整体布局'''
       vbox = QVBoxLayout()
       vbox.addLayout(vbox_name)
       vbox.addLayout(vbox_start)
       vbox.addLayout(vbox_data)

self.setLayout(vbox)

def start_btn_click(self):
       if self.start_btn.text().strip() == '开始点名':
           self.thread_.start()
       else:
           self.start_btn.setText('开始点名')

def set_name(self, name):
       self.current_name.setText(name)

def finished(self, finished):
       if finished is True:
           self.start_btn.setText('就是你了')

def import_btn_click(self):
       file = QFileDialog.getOpenFileName(self, '选择文件', os.getcwd(), 'Text File(*.txt)')
       file_path = file[0]
       print(file_path)
       fl = open(str(file_path), 'r', encoding='utf-8')
       self.data_list = fl.read().strip().split('\n')
       print(self.data_list)
       self.message.setText('信息提示 | 成功导入[' + str(len(self.data_list)) + ']条人员信息')

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

完整代码

# -*- coding:utf-8 -*-
# @author Python 集中营
# @date 2022/1/18
# @file test5.py

# 抖音同款课堂点名系统,PyQt5写起来很简单...

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

from qdarkstyle import load_stylesheet_pyqt5

import os
import sys
import time
import random

class WorkThread(QThread):
   trigger = pyqtSignal(str)
   finished = pyqtSignal(bool)

def __init__(self, parent=None):
       super(WorkThread, self).__init__(parent)
       self.parent = parent
       self.working = True

def __del__(self):
       self.working = False
       self.wait()

def run(self):
       data_list = self.parent.data_list
       if len(data_list) >= 1:
           ran = random.randint(20, 40)
           print('遍历次数:', ran)
           for a in range(ran):
               name = random.choice(data_list)
               self.trigger.emit(name)
               print(name)
               time.sleep(0.6)
           self.finished.emit(True)
       else:
           self.trigger.emit('无数据')

class ClassCollSystem(QWidget):
   def __init__(self):
       super(ClassCollSystem, self).__init__()
       self.data_list = []
       self.init_ui()

def init_ui(self):
       '''子线程调用'''
       self.thread_ = WorkThread(self)
       self.thread_.trigger.connect(self.set_name)
       self.thread_.finished.connect(self.finished)

'''应用初始化信息'''
       self.setWindowTitle('课堂点名系统  公众号:[Python 集中营]')
       self.setWindowIcon(QIcon('课堂点名.ico'))
       self.setFixedSize(500, 350)

'''姓名信息布局'''
       vbox_name = QVBoxLayout()
       self.current_name = QLabel()
       self.current_name.setText('随机点名啦')
       self.current_name.setStyleSheet(
           'font-size:50px;text-align:center;font-weight:bold;font-family:"Microsoft JhengHei";')

vbox_name.addWidget(self.current_name)
       vbox_name.setAlignment(Qt.AlignCenter)

'''开始信息布局'''
       vbox_start = QVBoxLayout()
       self.start_btn = QPushButton()
       self.start_btn.setText('开始点名')
       self.start_btn.setFixedSize(160, 50)
       self.start_btn.setStyleSheet(
           'font-size:30px;font-weight:bold;text-align:center;font-family:"Microsoft JhengHei";')
       self.start_btn.clicked.connect(self.start_btn_click)

vbox_start.addWidget(self.start_btn)
       vbox_start.setAlignment(Qt.AlignCenter)
       vbox_start.addSpacing(80)

'''数据信息布局'''
       vbox_data = QHBoxLayout()
       self.message = QLabel()
       self.message.setText('信息提示 | 公众号:[Python 集中营]')
       self.message.setStyleSheet(
           'font-size:12px;')

self.import_btn = QPushButton()
       self.import_btn.setText('导入数据')
       self.import_btn.setFixedSize(90, 25)
       self.import_btn.clicked.connect(self.import_btn_click)

vbox_data.addWidget(self.message)
       vbox_data.addStretch(1)
       vbox_data.addWidget(self.import_btn)

'''整体布局'''
       vbox = QVBoxLayout()
       vbox.addLayout(vbox_name)
       vbox.addLayout(vbox_start)
       vbox.addLayout(vbox_data)

self.setLayout(vbox)

def start_btn_click(self):
       if self.start_btn.text().strip() == '开始点名':
           self.thread_.start()
       else:
           self.start_btn.setText('开始点名')

def set_name(self, name):
       self.current_name.setText(name)

def finished(self, finished):
       if finished is True:
           self.start_btn.setText('就是你了')

def import_btn_click(self):
       file = QFileDialog.getOpenFileName(self, '选择文件', os.getcwd(), 'Text File(*.txt)')
       file_path = file[0]
       print(file_path)
       fl = open(str(file_path), 'r', encoding='utf-8')
       self.data_list = fl.read().strip().split('\n')
       print(self.data_list)
       self.message.setText('信息提示 | 成功导入[' + str(len(self.data_list)) + ']条人员信息')

if __name__ == '__main__':
   app = QApplication(sys.argv)
   app.setStyleSheet(load_stylesheet_pyqt5())
   main = ClassCollSystem()
   main.show()
   sys.exit(app.exec_())

来源:https://www.cnblogs.com/lwsbc/p/15872907.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com