基于PyQT5制作一個(gè)課堂點(diǎn)名系統(tǒng)
刷抖音的時(shí)候發(fā)現(xiàn)一個(gè)老師在用的課堂點(diǎn)名系統(tǒng)。用PyQt5實(shí)現(xiàn)了一下同款,導(dǎo)入學(xué)生姓名,測(cè)試了一下完美運(yùn)行。
操作效果展示:
完整源代碼塊還是放在了文章的最后面
使用的時(shí)候準(zhǔn)備好學(xué)生姓名的文件,使用導(dǎo)入數(shù)據(jù)的按鈕直接導(dǎo)入就可以開(kāi)始點(diǎn)名了。新建一個(gè)文本文檔,將姓名設(shè)置設(shè)置好,姓名文件示例如下。
使用系統(tǒng)庫(kù)或者第三方庫(kù)都比較常規(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界面的主線程分離開(kāi)來(lái),我們采用的還是QThread多線程的方式來(lái)實(shí)現(xiàn)隨機(jī)點(diǎn)名模塊的。這樣做的目的是為了防止主線程阻塞,下面是子線程的實(shí)現(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('無(wú)數(shù)據(jù)')
UI 界面的實(shí)現(xiàn)部分也比較常規(guī),下面主要實(shí)現(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) '''應(yīng)用初始化信息''' self.setWindowTitle('課堂點(diǎn)名系統(tǒng) 公眾號(hào):[Python 集中營(yíng)]') self.setWindowIcon(QIcon('課堂點(diǎn)名.ico')) self.setFixedSize(500, 350) '''姓名信息布局''' vbox_name = QVBoxLayout() self.current_name = QLabel() self.current_name.setText('隨機(jī)點(diǎn)名啦') 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) '''開(kāi)始信息布局''' vbox_start = QVBoxLayout() self.start_btn = QPushButton() self.start_btn.setText('開(kāi)始點(diǎn)名') 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('信息提示 | 公眾號(hào):[Python 集中營(yíng)]') self.message.setStyleSheet( 'font-size:12px;') self.import_btn = QPushButton() self.import_btn.setText('導(dǎo)入數(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() == '開(kāi)始點(diǎn)名': self.thread_.start() else: self.start_btn.setText('開(kāi)始點(diǎn)名') 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('信息提示 | 成功導(dǎo)入[' + str(len(self.data_list)) + ']條人員信息')
最后,將主頁(yè)面加入主體循環(huán)直接運(yùn)行可以了。
完整代碼
# -*- coding:utf-8 -*- # @author Python 集中營(yíng) # @date 2022/1/18 # @file test5.py # 抖音同款課堂點(diǎn)名系統(tǒng),PyQt5寫(xiě)起來(lái)很簡(jiǎn)單... 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('無(wú)數(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) '''應(yīng)用初始化信息''' self.setWindowTitle('課堂點(diǎn)名系統(tǒng) 公眾號(hào):[Python 集中營(yíng)]') self.setWindowIcon(QIcon('課堂點(diǎn)名.ico')) self.setFixedSize(500, 350) '''姓名信息布局''' vbox_name = QVBoxLayout() self.current_name = QLabel() self.current_name.setText('隨機(jī)點(diǎn)名啦') 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) '''開(kāi)始信息布局''' vbox_start = QVBoxLayout() self.start_btn = QPushButton() self.start_btn.setText('開(kāi)始點(diǎn)名') 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('信息提示 | 公眾號(hào):[Python 集中營(yíng)]') self.message.setStyleSheet( 'font-size:12px;') self.import_btn = QPushButton() self.import_btn.setText('導(dǎo)入數(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() == '開(kāi)始點(diǎn)名': self.thread_.start() else: self.start_btn.setText('開(kāi)始點(diǎn)名') 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('信息提示 | 成功導(dǎo)入[' + 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制作一個(gè)課堂點(diǎn)名系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于PyQT5點(diǎn)名系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pandas sample隨機(jī)抽樣的實(shí)現(xiàn)
隨機(jī)抽樣,是統(tǒng)計(jì)學(xué)中常用的一種方法,本文主要介紹了Pandas sample隨機(jī)抽樣的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06Python關(guān)于__name__屬性的含義和作用詳解
在本篇文章里小編給大家分享的是關(guān)于Python關(guān)于__name__屬性的含義和作用知識(shí)點(diǎn),需要的朋友們可以參考下。2020-02-02linux中使用Python對(duì)圖片進(jìn)行批量命名
大家好,本篇文章主要講的是linux中使用Python對(duì)圖片進(jìn)行批量命名,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12scrapy框架中用ssh連接遠(yuǎn)程服務(wù)器的實(shí)現(xiàn)
本文主要介紹了scrapy?框架中用ssh連接遠(yuǎn)程服務(wù)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01python實(shí)現(xiàn)簡(jiǎn)單猜單詞游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單猜單詞游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12Python編寫(xiě)一個(gè)趣味問(wèn)答小游戲
隨著六一兒童節(jié)的到來(lái),我們可以為孩子們編寫(xiě)一個(gè)有趣的小游戲,讓他們?cè)谟螒蛑袑W(xué)習(xí)有關(guān)六一兒童節(jié)的知識(shí)。本文將介紹如何用Python編寫(xiě)一個(gè)六一兒童節(jié)問(wèn)答小游戲及趣味比賽,需要的可以參考一下2023-06-06使用Python實(shí)現(xiàn)提取PDF文件中指定頁(yè)面的內(nèi)容
在日常工作和學(xué)習(xí)中,我們經(jīng)常需要從PDF文件中提取特定頁(yè)面的內(nèi)容,本文主要為大家詳細(xì)介紹了如何使用Python編程語(yǔ)言和兩個(gè)強(qiáng)大的庫(kù)——pymupdf和wxPython來(lái)實(shí)現(xiàn)這個(gè)任務(wù),需要的可以了解下2023-12-12python通過(guò)matplotlib生成復(fù)合餅圖
這篇文章主要介紹了python通過(guò)matplotlib生成復(fù)合餅圖,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02