基于PyQt5的一种点名器设计
基于PyQt5的一种点名器设计

基于PyQt5的一种点名器设计

教课时候,用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()

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注