基于PyQT5制作一個課堂點名系統(tǒng)
刷抖音的時候發(fā)現(xiàn)一個老師在用的課堂點名系統(tǒng)。用PyQt5實現(xiàn)了一下同款,導入學生姓名,測試了一下完美運行。
操作效果展示:

完整源代碼塊還是放在了文章的最后面
使用的時候準備好學生姓名的文件,使用導入數(shù)據(jù)的按鈕直接導入就可以開始點名了。新建一個文本文檔,將姓名設置設置好,姓名文件示例如下。

使用系統(tǒng)庫或者第三方庫都比較常規(guī),這里就不一一介紹了。
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多線程的方式來實現(xiàn)隨機點名模塊的。這樣做的目的是為了防止主線程阻塞,下面是子線程的實現(xiàn)部分。
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('遍歷次數(shù):', 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('無數(shù)據(jù)')
UI 界面的實現(xiàn)部分也比較常規(guī),下面主要實現(xiàn)部分的代碼塊。
class ClassCollSystem(QWidget):
def __init__(self):
super(ClassCollSystem, self).__init__()
self.data_list = []
self.init_ui()
def init_ui(self):
'''子線程調(diào)用'''
self.thread_ = WorkThread(self)
self.thread_.trigger.connect(self.set_name)
self.thread_.finished.connect(self.finished)
'''應用初始化信息'''
self.setWindowTitle('課堂點名系統(tǒng) 公眾號:[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)
'''數(shù)據(jù)信息布局'''
vbox_data = QHBoxLayout()
self.message = QLabel()
self.message.setText('信息提示 | 公眾號:[Python 集中營]')
self.message.setStyleSheet(
'font-size:12px;')
self.import_btn = QPushButton()
self.import_btn.setText('導入數(shù)據(jù)')
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)) + ']條人員信息')
最后,將主頁面加入主體循環(huán)直接運行可以了。
完整代碼
# -*- coding:utf-8 -*-
# @author Python 集中營
# @date 2022/1/18
# @file test5.py
# 抖音同款課堂點名系統(tǒng),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('遍歷次數(shù):', 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('無數(shù)據(jù)')
class ClassCollSystem(QWidget):
def __init__(self):
super(ClassCollSystem, self).__init__()
self.data_list = []
self.init_ui()
def init_ui(self):
'''子線程調(diào)用'''
self.thread_ = WorkThread(self)
self.thread_.trigger.connect(self.set_name)
self.thread_.finished.connect(self.finished)
'''應用初始化信息'''
self.setWindowTitle('課堂點名系統(tǒng) 公眾號:[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)
'''數(shù)據(jù)信息布局'''
vbox_data = QHBoxLayout()
self.message = QLabel()
self.message.setText('信息提示 | 公眾號:[Python 集中營]')
self.message.setStyleSheet(
'font-size:12px;')
self.import_btn = QPushButton()
self.import_btn.setText('導入數(shù)據(jù)')
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_())
以上就是基于PyQT5制作一個課堂點名系統(tǒng)的詳細內(nèi)容,更多關于PyQT5點名系統(tǒng)的資料請關注腳本之家其它相關文章!
相關文章
使用Python實現(xiàn)提取PDF文件中指定頁面的內(nèi)容
在日常工作和學習中,我們經(jīng)常需要從PDF文件中提取特定頁面的內(nèi)容,本文主要為大家詳細介紹了如何使用Python編程語言和兩個強大的庫——pymupdf和wxPython來實現(xiàn)這個任務,需要的可以了解下2023-12-12

