教课时候,用python写了一个点名器,方便上课时候提问用!!!
功能:支持顺序点名、随机点名、手动导入班级人员名单、点名速度调节
主界面:
代码部分:
import sys
import random
import re
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QRadioButton, QVBoxLayout, QHBoxLayout, \
QWidget, QFileDialog, QMessageBox, QSlider
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtGui import QFont
class App(QMainWindow):
def __init__(self):
super().__init__()
self.title = '随机点名'
self.left = 100
self.top = 100
self.width = 800
self.height = 600
self.names = []
self.timer = QTimer(self)
self.currentIndex = 0
self.speed = 50 # 默认速度
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.label = QLabel("是哪个小可爱?", self)
self.label.setAlignment(Qt.AlignCenter)
self.label.setStyleSheet("color: #1E90FF;")
self.update_font_size("是哪个小可爱?")
self.btn_start = QPushButton('开始', self)
self.btn_load = QPushButton('选择班级名单', self)
self.radio_sequence = QRadioButton('顺序点名', self)
self.radio_random = QRadioButton('随机点名', self)
self.radio_sequence.setChecked(True)
self.speed_label = QLabel(f'速度: {self.speed}', self)
self.speed_slider = QSlider(Qt.Horizontal, self)
self.speed_slider.setMinimum(1)
self.speed_slider.setMaximum(100)
self.speed_slider.setValue(self.speed)
self.speed_slider.setTickPosition(QSlider.TicksBelow)
self.speed_slider.setTickInterval(10)
self.speed_slider.valueChanged.connect(self.speed_changed)
self.btn_start.clicked.connect(self.toggle_start_point_name)
self.btn_load.clicked.connect(self.load_names)
self.timer.timeout.connect(self.update_name)
radio_layout = QHBoxLayout()
radio_layout.addWidget(self.radio_sequence)
radio_layout.addWidget(self.radio_random)
button_layout = QHBoxLayout()
button_layout.addWidget(self.btn_start)
button_layout.addWidget(self.btn_load)
slider_layout = QHBoxLayout()
slider_layout.addWidget(self.speed_label)
slider_layout.addWidget(self.speed_slider)
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addLayout(radio_layout)
layout.addLayout(button_layout)
layout.addLayout(slider_layout)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
def toggle_start_point_name(self):
if not self.names:
QMessageBox.warning(self, "警告", "请先导入人名单!")
return
if self.timer.isActive():
self.timer.stop()
self.btn_start.setText("开始")
self.btn_load.setEnabled(True)
else:
self.btn_start.setText("停止")
self.btn_load.setDisabled(True)
self.timer.start(2000 // self.speed) # Adjust speed based on slider
def update_name(self):
if self.radio_sequence.isChecked():
name = self.names[self.currentIndex]
self.currentIndex = (self.currentIndex + 1) % len(self.names)
elif self.radio_random.isChecked():
name = random.choice(self.names)
self.label.setText(name)
self.update_font_size(name)
def speed_changed(self, value):
self.speed = value
self.speed_label.setText(f'速度: {self.speed}')
if self.timer.isActive():
self.timer.start(2000 // self.speed) # Adjust timer interval based on speed
def load_names(self):
fname = QFileDialog.getOpenFileName(self, '选择一个文本文件', './', "文本文件 (*.txt)")
if fname[0]:
with open(fname[0], 'r', encoding='utf-8') as file:
all_names = [line.strip() for line in file.readlines()]
self.names = [name for name in all_names if re.match(r'^[\u4e00-\u9fa5]+$', name)]
invalid_names_count = len(all_names) - len(self.names)
if not self.names:
QMessageBox.warning(self, "警告", "名单为空或无有效中文名,请检查文件!")
else:
QMessageBox.information(self, "成功",
f"一共加载了{len(self.names)}个中文姓名,{invalid_names_count}个非中文姓名被忽略。")
self.currentIndex = 0
def update_font_size(self, name):
if len(name) <= 2:
self.label.setFont(QFont('Arial', 80, QFont.Bold))
elif len(name) <= 4:
self.label.setFont(QFont('Arial', 60, QFont.Bold))
else:
self.label.setFont(QFont('Arial', 48, QFont.Bold))
def main():
app = QApplication(sys.argv)
ex = App()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()