刷抖音的时候发现一个老师在用的课堂点名系统。用PyQt5实现了一下同款,导入学生姓名,测试了一下完美运行。
操作效果展示:
完整源代码块还是放在了文章的最后面
使用的时候准备好学生姓名的文件,使用导入数据的按钮直接导入就可以开始点名了。新建一个文本文档,将姓名设置设置好,姓名文件示例如下。
使用系统库或者第三方库都比较常规,这里就不一一介绍了。
1
2
3
4
5
6
7
8
9
10
|
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多线程的方式来实现随机点名模块的。这样做的目的是为了防止主线程阻塞,下面是子线程的实现部分。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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 界面的实现部分也比较常规,下面主要实现部分的代码块。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
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)) + ']条人员信息' ) |
最后,将主页面加入主体循环直接运行可以了。
完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# -*- 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点名系统的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/lwsbc/p/15872907.html