首頁 > 軟體

基於PyQT5製作一個課堂點名系統

2022-02-09 10:00:45

刷抖音的時候發現一個老師在用的課堂點名系統。用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_())

以上就是基於PyQT5製作一個課堂點名系統的詳細內容,更多關於PyQT5點名系統的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com