亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Python實現(xiàn)多功能課堂點名器與抽簽工具

 更新時間:2024年02月29日 08:31:43   作者:PythonFun  
這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)多功能課堂點名器,也可以用作抽簽工具,感興趣的小伙伴可以跟隨小編一起學習一下

一、問題緣起

去年,ChatGPT浪潮襲來,我懂簡單的Python基礎語法,又有一些點子,于是借助于人工智能問答工具,一步一步地制作了一個點名器,也可以用于抽簽。當時,我已經設計好頁面和基礎的功能,并在廣大網友中開啟了測試。

點名器1.0

目前,寫的這個點名器的文章閱讀里已經達到了近700次,而且有6個人收藏,這說明很多人還是挺需要這樣的點名器的。不過,也有網友給我留言,提出了修改的建議,如點名器這個界面有點兒大,教學過程中有時用到,有時用不到,用到時可以展示,不用時,能不能把這個界面最小化到右上角,再點右上角把它調出來。

還有人說,如果抽到這個人,能不能把名字也讀出來,這樣就不用老師再說他們的名字了。聽到聲音,看到自己的名字,學生就可以站起來直接回答問題了,老師也不必再念學生名字了。

順便說一下:當時,我剛自學Python,主要是看董付國的書,講的通俗易懂,內容也很豐富,重要的知識點都講到了。我看的就是下面這本書:

只是懂一些基本的語法,但是在人工智能的加持下,我很快就學會了自主編程。

之前,一直忙其它的事情,沒有抽出時間來,現(xiàn)在我用了ChatGPT的幫助,相信利用Python做一些小項目的開發(fā)都不是難事。

二、開發(fā)過程

1. 為點名器添加最大化、最小化功能

首先,我對原有點名器的改造與升級都是基于第一個版本,我需要添加的是朗讀、最小化這兩個功能。

向ChatGPT提問

ChatGPT根據我的請求,很快給出了相應的代碼:

import tkinter as tk
 
class MinimizeApp:
    def __init__(self, master):
        self.master = master
        self.master.geometry("800x600")  # 初始大小
        self.minimized = False  # 標記是否已最小化
        self.original_geometry = ''  # 存儲原始窗口大小
        
        # 最小化/最大化按鈕
        self.toggle_btn = tk.Button(master, text="最小化", command=self.toggle)
        self.toggle_btn.pack()
 
        # 配置最小化時顯示的小窗口
        self.mini_window = tk.Toplevel(self.master)
        self.mini_window.geometry("100x50+{}+0".format(self.master.winfo_screenwidth() - 100))
        self.mini_window.overrideredirect(True)  # 去除窗口邊框
        self.mini_window.withdraw()  # 初始時隱藏
 
        # 最大化按鈕
        self.maximize_btn = tk.Button(self.mini_window, text="最大化", command=self.toggle)
        self.maximize_btn.pack(fill=tk.BOTH, expand=True)
 
    def toggle(self):
        if self.minimized:  # 如果當前是最小化,恢復窗口
            self.master.deiconify()  # 顯示主窗口
            self.master.geometry(self.original_geometry)  # 恢復原始大小
            self.mini_window.withdraw()  # 隱藏最小化窗口
            self.toggle_btn.config(text="最小化")
            self.minimized = False
        else:  # 如果當前是正常大小,最小化窗口
            self.original_geometry = self.master.geometry()  # 存儲當前大小和位置
            self.master.withdraw()  # 隱藏主窗口
            self.mini_window.deiconify()  # 顯示最小化窗口
            self.minimized = True
 
def main():
    root = tk.Tk()
    app = MinimizeApp(root)
    root.mainloop()
 
if __name__ == "__main__":
    main()

上面的代碼可以實現(xiàn)一個自定義的最小化/最大化功能,首先創(chuàng)建一個最小化按鈕,當用戶點擊這個按鈕時,整個應用窗口縮小至屏幕的右上角,并只顯示一個最大化按鈕。再次點擊這個最大化按鈕時,窗口恢復到其原始大小。

我們通過手動點擊的方式,管理窗口的大小和位置,以及按鈕的顯示和隱藏。

下一步是把以上代碼,融入到點名器1.0當中,我們需要對這里的按紐對象名稱進行修改,刪除與舊版相比重復的代碼,同時還要修復調試過程中的報錯。

上課過程中,我又進行了實地的測試,發(fā)現(xiàn)最小化后窗品沒有置于所有窗口的最前方,于是,我于向ChatGPT發(fā)問,如果設置最小化窗口前端顯示,它很快給了我下面的代碼:

self.mini_window.attributes('-topmost', 1)

果然,通過這個代碼,前置顯示問題很快解決了。

2. 為點名器添加朗讀功能

增加了最大最小化窗口的功能,我還想讓點名器自動朗讀出點名器上的人名,這樣顯示的名字和朗讀的聲音匹配起來,可以最大可能地節(jié)省老師的時間和體力,進一步提升講課的效率。

為了使軟件可以發(fā)聲,我們需要導入一個pyttsx3這個包,同時還要保證軟件聯(lián)網。

當滾動到顯示的人名時,就會觸發(fā)朗讀的功能。當然,也有人不想使用朗讀的功能,或者使用的電腦無法上網,這時我們就需要增加一個復選框,用復選框來控制是否朗讀發(fā)聲。

我能過向ChatGPT提問得到了如下回復:

增加復選框

接下來,我要做的是,在def __init__(self, master)這個初始化函數里,加上一個復選框代碼,同時通過檢測復選 框check_var的值,來控制是否朗讀發(fā)聲。注意這里的復選框不需要定義命令函數。

最后,在測試時,我發(fā)現(xiàn)軟件不朗讀人名,后來才發(fā)現(xiàn)self.engine = pyttsx3.init()這個發(fā)聲引擎的初始化要在軟件界面初始化前啟動。

3. 軟件使用展示

經過中午和下午的修改測試,終于完成了新版點名器的雛形,如下圖所示:

4. 優(yōu)化后代碼

在增加朗讀、最小化等功能同時,我征求網友的意見,又增加了姓名字體的自動調節(jié)功能。而且,為了讓界面顯示的更好看,我把按紐居中顯示,最后形成以下軟件。

軟件代碼如下:

# 2023年4月10日更新1. 修復按紐點擊開始再點擊暫停2. 增加標記功能 3.增加歡迎頁 4.改變播放速度
# 2024年2月28日更新1. 增加人名朗讀 2. 增加窗口最小化功能 3. 按紐居中 4. 字體大小控制
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
import os
import random
import time
import pyttsx3
 
class RollCallApp:
    def __init__(self, master):
        self.engine = pyttsx3.init()
        self.master = master
        self.master.title("點名器 Gordon QQ:403096966")
        #self.master.resizable(False, False)
        #self.master.geometry("880x300")  # 初始大小
        self.minimized = False  # 標記是否已最小化
        self.master.protocol("WM_DELETE_WINDOW", self.display_messagebox) # 彈窗提示確認退出
        self.master.attributes('-topmost', True)
        # 讀取文件中的名字
        self.names = []
        self.load_names()
 
        # 播放名字的控件
        self.label_name = tk.Label(self.master, text="歡迎使用點名器", font=("Times New Roman", 90), fg="blue")
        self.label_name.pack(pady=50)
        
        
        #設置frame 居中顯示
        button_frame = tk.Frame(self.master)
        button_frame.pack()
        items = ("加分","曠課", "遲到", "請假")
        self.combo = ttk.Combobox(button_frame, values=items, font=("宋體", 20),width=5)
        self.combo.set("加分")  # 設置默認值
        self.combo.configure(font=("宋體", 20))
        #設置字體大小寫
        self.scale = tk.Scale(self.master, from_ = 30, to = 210, orient = 'horizontal',command = self.resize)
        self.scale.set(80)
        self.scale.pack(expand=True, fill=tk.BOTH,side=tk.BOTTOM) 
        
        # 設置退出按鈕
        self.button_quit = tk.Button(button_frame, text="退出", font=("宋體", 20), width=9, command=self.display_messagebox)
        self.button_quit.pack(side=tk.LEFT,anchor="center",padx=22)
        # 設置標記內容
        self.combo.pack(side=tk.LEFT, fill=tk.BOTH, padx=5)
        
        # 創(chuàng)建一個IntVar對象來存儲復選框的狀態(tài)
        self.check_var = tk.IntVar(value=0)  # 默認值設置為0(未選中)
        
        # 控制按鈕
        self.button_mark = tk.Button(button_frame, text="標記", font=("宋體", 20), width=9, command=self.write_txt)
        self.button_mark.pack(side=tk.LEFT,anchor="center",padx=20)
        
        # 創(chuàng)建復選框,綁定到check_var變量
        self.checkbox = tk.Checkbutton(button_frame, text="發(fā)聲", font=("宋體", 12), variable=self.check_var)
        self.checkbox.pack(side=tk.LEFT,anchor="center", padx=3)
 
        # 控制按鈕
        self.button_action = tk.Button(button_frame, text="開始", font=("宋體", 20), width=9, command=self.toggle_rolling)
        self.button_action.pack(side=tk.LEFT, anchor="center",padx=20)
 
        self.button_min = tk.Button(button_frame, text="最小化", font=("宋體", 20), width=9, command=self.toggle)
        self.button_min.pack(side=tk.LEFT,anchor="center", padx=20)
        
        # 配置最小化時顯示的小窗口
        self.mini_window = tk.Toplevel(self.master)
        self.mini_window.geometry("100x50+{}+0".format(self.master.winfo_screenwidth() - 100))
        self.mini_window.overrideredirect(True)  # 去除窗口邊框
        self.mini_window.withdraw()  # 初始時隱藏
 
        # 最大化按鈕
        self.maximize_btn = tk.Button(self.mini_window, text="最大化",font=("宋體", 15, "bold"), command=self.toggle)
        self.maximize_btn.pack(fill=tk.BOTH, expand=True)
        
        # 控制變量
        self.rolling = False
        self.current_name = ""
        
        #設置引擎
        self.engine.setProperty('language', 'zh-CN')
        rate = self.engine.getProperty('rate')
        self.engine.setProperty('rate', rate - 50)
        # 設置發(fā)音大小,范圍為0.0-1.0
        volume = self.engine.getProperty('volume')
        self.engine.setProperty('volume', 1.2)
        # 設置默認的聲音:voices[0].id代表男生,voices[1].id代表女生
        voices = self.engine.getProperty('voices')
        self.engine.setProperty('voice', voices[0].id)
    def resize(self,ev = None):
        # 監(jiān)控窗口是不是最大化,最大化則字體變大,否則為55號字
        if self.master.state() == 'zoomed':
            self.label_name.config(font = '宋體 -%d bold' % self.scale.get())
        elif not self.master.state() == 'zoomed':#self.root.state() == 'iconic':
            self.label_name.config(font = '宋體 -%d bold' % self.scale.get())
        
    def toggle(self):
        if self.minimized:  # 如果當前是最小化,恢復窗口
            self.master.deiconify()  # 顯示主窗口
            #self.master.geometry("880x300")  # 初始大小
            #self.master.geometry(self.original_geometry)  # 恢復原始大小
            self.mini_window.withdraw()  # 隱藏最小化窗口
            self.button_min.config(text="最小化")
            self.minimized = False
        else:  # 如果當前是正常大小,最小化窗口
            self.original_geometry = self.master.geometry()  # 存儲當前大小和位置
            self.master.withdraw()  # 隱藏主窗口
            self.mini_window.deiconify()  # 顯示最小化窗口
            self.mini_window.attributes('-topmost', 1)
            self.minimized = True        
        
 
    def load_names(self):
        """從當前目錄下的names.txt文件中讀取名字"""
        if os.path.exists("names.txt"):
            with open("names.txt", "r", encoding="utf-8") as f:
                for name in f:
                    name = name.strip()
                    if name:
                        self.names.append(name)
        else:
            messagebox.showerror("錯誤","找不到names.txt,請把人名放到當前目錄下的names.txt中!")
            with open("names.txt", "w+", encoding="utf-8") as fi:
                fi.write("")
    def write_txt(self):
        label_text = self.label_name.cget("text")
        with open("標記內容.txt",'a+',encoding='utf-8') as f:
            f.write(label_text + f" {self.combo.get()}\n")
 
    def toggle_rolling(self):
        """切換播放狀態(tài),并更新按鈕文字"""
        self.rolling = not self.rolling
        if self.rolling:
            self.button_action.config(text="暫停")
            self.roll_name()
            if self.check_var.get() == 1:
                self.engine.say(self.current_name)
                self.engine.runAndWait()
        else:
            self.button_action.config(text="開始")
 
    def roll_name(self):
        """隨機選取一個名字播放"""
 
        if self.names:
            self.current_name = random.choice(self.names)
            self.label_name.config(text=self.current_name)
            self.master.update()
            time.sleep(0.01)
            if self.rolling:
                self.roll_name()
 
    def display_messagebox(self):
        """彈窗提示是否確認退出程序"""
        if messagebox.askokcancel("退出程序", "確定要退出程序嗎?"):
            self.master.destroy()
 
if __name__ == "__main__":
    root = tk.Tk()
    app = RollCallApp(root)
    root.mainloop()
 

三、學后反思

本軟件最初編寫于去年的四月份,今年的二月突然有了新的靈感,短時間內增加了二個不錯的功能。看來軟件的編寫也是需要一定時間的打磨。在汲取用戶意見的同時,還要利用ChatGPT對原有的軟件進行改造升級。

Python是當下最熱門的編程語言,在人工智能領域發(fā)揮著不可替代的作用。它的擴展性、靈活性極強,可以實現(xiàn)跨平臺的應用,被廣泛應用于Web開發(fā)、網絡爬蟲、辦公自動化等領域。因此,為自己的工作和生活帶來極大的便利,我建議大家盡早學習這門流行的語言。在ChatGPT的賦能下,每個人都可以借用于視頻、書本輕松學會它。

以上就是使用Python實現(xiàn)多功能課堂點名器與抽簽工具的詳細內容,更多關于Python點名器的資料請關注腳本之家其它相關文章!

相關文章

最新評論