溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用Python做個(gè)上課點(diǎn)名器

發(fā)布時(shí)間:2021-09-30 13:37:05 來(lái)源:億速云 閱讀:192 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“怎么用Python做個(gè)上課點(diǎn)名器”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“怎么用Python做個(gè)上課點(diǎn)名器”這篇文章吧。

首先我們還是一起先來(lái)看看點(diǎn)名器實(shí)現(xiàn)的效果:

怎么用Python做個(gè)上課點(diǎn)名器

下面,我們開始介紹這款點(diǎn)名器的制作過程。

獲取源碼及exe打包程序,點(diǎn)擊下載

一、核心功能設(shè)計(jì)

總體來(lái)說(shuō),我們這款點(diǎn)名器實(shí)現(xiàn)的思路大致是,可以自定義設(shè)置班級(jí)學(xué)生姓名或者默認(rèn)通過學(xué)號(hào)進(jìn)行學(xué)生隨機(jī)點(diǎn)名抽取,可以每次單人抽取也可以自己選擇連抽人數(shù)進(jìn)行多人連抽,并將這些隨機(jī)抽取的學(xué)生姓名歷史數(shù)據(jù)顯示。

拆解需求,接下來(lái)我們可以通過以下幾步進(jìn)行實(shí)現(xiàn):

  • UI排版布局設(shè)計(jì),確認(rèn)點(diǎn)名器的各個(gè)功能設(shè)計(jì)

  • 讀取班級(jí)學(xué)生的姓名文件,將各個(gè)學(xué)生的姓名加載到列表中,如果沒有學(xué)生姓名文件默認(rèn)創(chuàng)建學(xué)號(hào)文件

  • 實(shí)現(xiàn)對(duì)學(xué)生姓名的隨機(jī)點(diǎn)名抽取功能

  • 實(shí)現(xiàn)多人連抽模式

  • 查看隨機(jī)抽取的學(xué)生姓名歷史數(shù)據(jù)

二、實(shí)現(xiàn)步驟

之前有讀者反饋說(shuō),不知道程序中具體需要哪些模塊、包文件,下面我就把程序中用到模塊先放出來(lái)。主要包括了文件讀寫,隨機(jī)數(shù),PyQt5,win32con等。

import sys,os
from random import randint
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import *
from win32api import MessageBox
from win32con import MB_OK, MB_ICONWARNING

1. UI排版布局設(shè)計(jì)

根據(jù)點(diǎn)名器所需要的功能,首先我們可以進(jìn)行UI布局設(shè)計(jì),我們這次還是使用的pyqt5。主要包含了姓名的隨機(jī)抽取顯示功能、連抽模式的隨機(jī)抽取顯示、抽取歷史結(jié)果的查看功能、姓名文件的讀取顯示等。核心設(shè)計(jì)代碼如下:

# author:Dragon少年
def setupUi(self, MainWindow):
    #以下課直接粘貼生成的setupui代碼
    MainWindow.setObjectName("點(diǎn)名器")
    MainWindow.resize(420, 360)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.label = QtWidgets.QLabel(self.centralwidget)
    self.label.setGeometry(QtCore.QRect(55, 50, 331, 71))
    font = QtGui.QFont()
    font.setFamily("宋體")
    font.setPointSize(50)
    self.label.setFont(font)
    self.label.setObjectName("label")
    self.pushButton = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton.setGeometry(QtCore.QRect(55, 190, 111, 61))
    font = QtGui.QFont()
    font.setFamily("宋體")
    font.setPointSize(20)
    self.pushButton.setFont(font)
    self.pushButton.setObjectName("pushButton")
    self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_2.setGeometry(QtCore.QRect(253, 190, 111, 61))
    font = QtGui.QFont()
    font.setFamily("宋體")
    font.setPointSize(20)
    self.pushButton_2.setFont(font)
    self.pushButton_2.setObjectName("pushButton_2")
    self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_3.setGeometry(QtCore.QRect(11, 570, 111, 41))
    self.pushButton_3.setObjectName("pushButton_3")
    self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_4.setGeometry(QtCore.QRect(0, 830, 111, 41))
    self.pushButton_4.setObjectName("pushButton_4")
    self.listWidget = QtWidgets.QListWidget(self.centralwidget)
    self.listWidget.setGeometry(QtCore.QRect(11, 370, 397, 191))
    self.listWidget.setObjectName("listWidget")
    self.label_2 = QtWidgets.QLabel(self.centralwidget)
    self.label_2.setGeometry(QtCore.QRect(11, 340, 210, 21))
    self.label_2.setObjectName("label_2")
    self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_5.setGeometry(QtCore.QRect(11, 303, 111, 20))
    self.pushButton_5.setObjectName("pushButton_5")
    self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_6.setGeometry(QtCore.QRect(319, 300, 75, 20))
    self.pushButton_6.setObjectName("pushButton_6")
    self.label_3 = QtWidgets.QLabel(self.centralwidget)
    self.label_3.setGeometry(QtCore.QRect(495, 260, 56, 21))
    self.label_3.setObjectName("label_3")
    self.label_3.setStyleSheet('color:white;background:#222225')
    self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_7.setGeometry(QtCore.QRect(649, 240, 111, 61))
    font = QtGui.QFont()
    font.setFamily("宋體")
    font.setPointSize(30)
    self.pushButton_7.setFont(font)
    self.pushButton_7.setObjectName("pushButton_7")
    self.listWidget_2 = QtWidgets.QListWidget(self.centralwidget)
    self.listWidget_2.setGeometry(QtCore.QRect(473, 20, 353, 221))
    font = QtGui.QFont()
    font.setPointSize(14)
    self.listWidget_2.setFont(font)
    self.listWidget_2.setFocusPolicy(QtCore.Qt.WheelFocus)
    self.listWidget_2.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
    self.listWidget_2.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)        self.listWidget_2.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
    self.listWidget_2.setObjectName("listWidget_2")
    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 874, 23))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)
    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)
    self.pushButton.clicked.connect(self.start)
    self.pushButton_2.clicked.connect(self.stop)
    self.pushButton_5.clicked.connect(self.showHistory)
    self.pushButton_6.clicked.connect(self.showContinue)
    self.pushButton_7.clicked.connect(self.ten)                  
    self.listWidget.setStyleSheet(self.scc)
    self.listWidget_2.setStyleSheet(self.scc)
    MainWindow.setWindowOpacity(0.95)  # 設(shè)置窗口透明度
    MainWindow.setAttribute(Qt.WA_TranslucentBackground)
    MainWindow.setWindowFlag(Qt.FramelessWindowHint)  # 隱藏邊框

    self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton_8.setGeometry(QtCore.QRect(132, 570, 100, 41))
    self.pushButton_8.setObjectName("pushButton_8")
    self.pushButton_8.clicked.connect(self.rename)
    self.pushButton_8.setText('重置名字文件')

# author:Dragon少年
def retranslateUi(self, MainWindow):
    self.wide = 420
    self.high = 360
    _translate = QtCore.QCoreApplication.translate
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    self.label.setText(_translate("MainWindow", "恭喜{}號(hào)"))
    self.label.setStyleSheet('color:white')
    self.pushButton.setText(_translate("MainWindow", "開始"))
    self.pushButton_2.setText(_translate("MainWindow", "結(jié)束"))
    self.pushButton_3.setText(_translate("MainWindow", "打開名字文件"))
    self.pushButton_4.setText(_translate("MainWindow", "開gua選項(xiàng)"))
    self.label_2.setText(_translate("MainWindow", "點(diǎn)過的學(xué)號(hào)/姓名:"))
    self.pushButton_5.setText(_translate("MainWindow", "查看點(diǎn)過的名字"))
    self.pushButton_6.setText(_translate("MainWindow", "連抽模式"))
    self.label_3.setText(_translate("MainWindow", "連抽人數(shù)"))
    self.pushButton_7.setText(_translate("MainWindow", "開始"))

UI實(shí)現(xiàn)效果如下:

怎么用Python做個(gè)上課點(diǎn)名器

對(duì)于這個(gè)點(diǎn)名器界面,之前有讀者粉絲私信我,如何實(shí)現(xiàn)將某些內(nèi)容顯示及隱藏動(dòng)態(tài)控制,今天我們就通過這個(gè)點(diǎn)名器進(jìn)行演示實(shí)現(xiàn)。

例如對(duì)于這個(gè)點(diǎn)名器,我們想默認(rèn)情況下,不要顯示抽取的學(xué)生歷史數(shù)據(jù),也不要顯示連抽相關(guān)的內(nèi)容,想讓這個(gè)點(diǎn)名器界面更加簡(jiǎn)潔直觀一些,如下圖所示。

怎么用Python做個(gè)上課點(diǎn)名器

那么這個(gè)功能該如何實(shí)現(xiàn)呢?其實(shí)也非常簡(jiǎn)單,只要我們定義一個(gè)事件函數(shù),通過對(duì)界面窗體的寬高進(jìn)行resize重置,然后將該事件函數(shù)綁定到類似按鈕點(diǎn)擊事件上,就可以實(shí)現(xiàn)動(dòng)態(tài)顯示/隱藏部分界面內(nèi)容了。核心代碼如下:

# author:Dragon少年
# 點(diǎn)擊“查看點(diǎn)過的名字”時(shí),調(diào)用該函數(shù),對(duì)界面窗體高度大小進(jìn)行resize重置
def showHistory(self):
    global seed
    if not seed:
        self.high = 656
        MainWindow.resize(self.wide,self.high)
        seed = True
    else:
        self.high = 360
        MainWindow.resize(self.wide, self.high)
        seed = False

# 點(diǎn)擊“連抽模式”時(shí),調(diào)用該函數(shù),對(duì)界面窗體寬度大小進(jìn)行resize重置
def showContinue(self):
    global choud
    if not choud:
        self.wide = 874
        MainWindow.resize(self.wide, self.high)
        choud = True
    else:
        self.wide = 420
        MainWindow.resize(self.wide, self.high)
        choud = False

UI布局設(shè)計(jì)完成,下面我們開始進(jìn)行班級(jí)學(xué)生姓名的讀取加載。

2. 學(xué)生姓名加載

接下來(lái)我們需要對(duì)要隨機(jī)點(diǎn)名抽取的學(xué)生姓名進(jìn)行加載放到一個(gè)列表中,這里我們需要注意是否有name.txt文件,如果有可以直接讀取加載姓名數(shù)據(jù),如果沒有該文件,則需要默認(rèn)根據(jù)數(shù)字進(jìn)行學(xué)號(hào)文件創(chuàng)建。核心代碼如下:

# author:Dragon少年
def name():
    with open('name.txt', 'w') as f:
        print(f.truncate())
        print(f.write(a))

try:
    wordlist3 = []
    with open('name.txt', encoding='utf8') as f:
        for line in f.readlines():
            wordlist3.append(line.strip('\n'))  # strip('\n')去掉字符串中的'\n'
    print(wordlist3)
    name_list = wordlist3
except:
    name()
    MessageBox(0, "請(qǐng)及時(shí)修改當(dāng)前目錄下name文件,默認(rèn)將為1-52", "MessageBox", MB_OK | MB_ICONWARNING)
    name_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', ]

3. 隨機(jī)點(diǎn)名實(shí)現(xiàn)

隨機(jī)點(diǎn)名我們可以設(shè)計(jì)兩個(gè)按鈕,分別來(lái)控制開始抽取和停止抽取功能,通過定時(shí)器來(lái)進(jìn)行學(xué)生姓名列表數(shù)據(jù)的隨機(jī)抽取,從而實(shí)現(xiàn)隨機(jī)點(diǎn)名的功能。核心代碼如下:

# author:Dragon少年
# 對(duì)姓名列表進(jìn)行隨機(jī)顯示 模擬隨機(jī)點(diǎn)名功能
def setname(self):
    global running
    global name
    try:
        name = name_list[randint(0, len(name_list) - 1)]
        self.label.setText("恭喜{}號(hào)?。?!".format(name))
    except:
        self.name()
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'發(fā)生錯(cuò)誤,請(qǐng)檢查name文件的學(xué)號(hào)后再重新打開本軟件', QtWidgets.QMessageBox.Yes)
        sys.exit()

# 開始按鈕綁定 通過定時(shí)器加載隨機(jī)點(diǎn)名函數(shù)
def start(self):
    global running
    if running:
        print('running')
        pass
    else:
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.setname)
        self.timer.start(50)
        running = 'True'

# 結(jié)束按鈕綁定 控制定時(shí)器停止
def stop(self):
    global running, a
    if running:
        self.timer.stop()
        running = False
        self.listWidget.addItem(name)
    else:
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'還沒開始就想結(jié)束?', QtWidgets.QMessageBox.Yes)

至此,我們已經(jīng)可以實(shí)現(xiàn)點(diǎn)名功能了,如下所示。

怎么用Python做個(gè)上課點(diǎn)名器

4. 連抽模式實(shí)現(xiàn)

隨機(jī)抽取功能已經(jīng)實(shí)現(xiàn)了,多人連抽和隨機(jī)抽取類似,只要進(jìn)行姓名列表隨機(jī)抽取對(duì)應(yīng)人數(shù)就可以了。當(dāng)然對(duì)抽取人數(shù)的輸入,我們需要進(jìn)行一些輸入限制,避免一些異常輸入情況,例如輸入非數(shù)字、輸入負(fù)數(shù)、輸入數(shù)字過大等。我們只要將連抽函數(shù)同樣綁定到按鈕上就可以了。核心代碼如下:

# author:Dragon少年
def ten(self):
    num = self.lineEdit.text()
    print (num)
    num = int(num)
    if not num =='' and not num<=0 and not num>1000:
        if num > 20:
            reply = QtWidgets.QMessageBox.warning(self, u'警告', u'認(rèn)真的嗎,這么多', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()
        for i in range (0,int(num)):
            name = name_list[randint(0, len(name_list) - 1)]
            self.listWidget_2.addItem(name)
            self.listWidget.addItem(name)
    elif num =='':
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'請(qǐng)輸入數(shù)字', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()
    elif num<0:
        #win32api.MessageBox(0, "你見過負(fù)數(shù)個(gè)人么???????", "通知", win32con.MB_OK | win32con.MB_ICONWARNING)
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'人數(shù)負(fù)數(shù),輸入有誤!', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()
    elif num==0:
        #win32api.MessageBox(0, "人都被你吃了???", "通知", win32con.MB_OK | win32con.MB_ICONWARNING)
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'人數(shù)為0,輸入有誤!', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()
    elif num>1000:
        #win32api.MessageBox(0, "這么大?要不起~", "通知", win32con.MB_OK | win32con.MB_ICONWARNING)
        reply = QtWidgets.QMessageBox.warning(self, u'警告', u'人數(shù)超出限制,輸入有誤!', QtWidgets.QMessageBox.Yes)
        self.listWidget_2.clear()

5. 抽取歷史查看

我們最后再實(shí)現(xiàn)一個(gè)對(duì)點(diǎn)名的學(xué)生姓名進(jìn)行歷史數(shù)據(jù)顯示查看功能。該功能實(shí)現(xiàn)也很簡(jiǎn)單,只要對(duì)上面隨機(jī)抽取的姓名添加到對(duì)應(yīng)的歷史列表框中就可以了;還可以對(duì)學(xué)生姓名文件進(jìn)行重置等功能。核心代碼如下:

# author:Dragon少年
def rename(self):
     reply = QtWidgets.QMessageBox.question(self, u'警告', u'確定重置name文件為1-52?', QtWidgets.QMessageBox.Yes,
                                            QtWidgets.QMessageBox.No)
     if reply == QtWidgets.QMessageBox.Yes:
         with open('name.txt', 'w') as f:
             print(f.truncate())
             print(f.write(a))
         MessageBox(0, "重置完成,", "通知", MB_OK | MB_ICONWARNING)
     else:
         pass

至此,這款點(diǎn)名器就完成了, 一起來(lái)看看效果吧!

怎么用Python做個(gè)上課點(diǎn)名器

4. 打包配置

最近有好幾個(gè)粉絲問我,Python能不能打包成exe?如何打包呢?之前已經(jīng)介紹過了,今天就通過這個(gè)再來(lái)來(lái)一起介紹下。

Python常用的打包工具是第三方庫(kù)Pyinstaller,需要安裝下pyinstaller。

pip install Pyinstaller

接下來(lái),我們需要打開命令窗口,切換到項(xiàng)目目錄下再執(zhí)行打包命令。

pyinstaller -F -i ./img.ico 點(diǎn)名.py

打包常用的參數(shù)如下:

  • -F 表示生成單個(gè)可執(zhí)行文件

  • -p 表示你自己自定義需要加載的類路徑,一般情況下用不到

  • -i 表示可執(zhí)行文件的圖標(biāo)

  • -w 表示去掉控制臺(tái)窗口,這在GUI界面時(shí)非常有用

之前有小伙伴問我,打包的圖標(biāo)需要.ico后綴的圖片,應(yīng)該如何把普通圖片轉(zhuǎn)成圖標(biāo)格式.ico呢?Python也可以幫你實(shí)現(xiàn)圖片轉(zhuǎn).ico文件。核心代碼如下:

import PythonMagick

# 生成圖標(biāo)ico(png格式圖片轉(zhuǎn)成ico)
img = PythonMagick.Image('./image/img1/1.png')
# 這里要設(shè)置一下尺寸,不然會(huì)報(bào)ico尺寸異常錯(cuò)誤
img.sample('128x128')
img.write('./img.ico')

以上是“怎么用Python做個(gè)上課點(diǎn)名器”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI