使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器與抽簽工具
一、問題緣起
去年,ChatGPT浪潮襲來,我懂簡(jiǎn)單的Python基礎(chǔ)語法,又有一些點(diǎn)子,于是借助于人工智能問答工具,一步一步地制作了一個(gè)點(diǎn)名器,也可以用于抽簽。當(dāng)時(shí),我已經(jīng)設(shè)計(jì)好頁面和基礎(chǔ)的功能,并在廣大網(wǎng)友中開啟了測(cè)試。
點(diǎn)名器1.0
目前,寫的這個(gè)點(diǎn)名器的文章閱讀里已經(jīng)達(dá)到了近700次,而且有6個(gè)人收藏,這說明很多人還是挺需要這樣的點(diǎn)名器的。不過,也有網(wǎng)友給我留言,提出了修改的建議,如點(diǎn)名器這個(gè)界面有點(diǎn)兒大,教學(xué)過程中有時(shí)用到,有時(shí)用不到,用到時(shí)可以展示,不用時(shí),能不能把這個(gè)界面最小化到右上角,再點(diǎn)右上角把它調(diào)出來。
還有人說,如果抽到這個(gè)人,能不能把名字也讀出來,這樣就不用老師再說他們的名字了。聽到聲音,看到自己的名字,學(xué)生就可以站起來直接回答問題了,老師也不必再念學(xué)生名字了。
順便說一下:當(dāng)時(shí),我剛自學(xué)Python,主要是看董付國的書,講的通俗易懂,內(nèi)容也很豐富,重要的知識(shí)點(diǎn)都講到了。我看的就是下面這本書:
只是懂一些基本的語法,但是在人工智能的加持下,我很快就學(xué)會(huì)了自主編程。
之前,一直忙其它的事情,沒有抽出時(shí)間來,現(xiàn)在我用了ChatGPT的幫助,相信利用Python做一些小項(xiàng)目的開發(fā)都不是難事。
二、開發(fā)過程
1. 為點(diǎn)名器添加最大化、最小化功能
首先,我對(duì)原有點(diǎn)名器的改造與升級(jí)都是基于第一個(gè)版本,我需要添加的是朗讀、最小化這兩個(gè)功能。
向ChatGPT提問
ChatGPT根據(jù)我的請(qǐng)求,很快給出了相應(yīng)的代碼:
import tkinter as tk class MinimizeApp: def __init__(self, master): self.master = master self.master.geometry("800x600") # 初始大小 self.minimized = False # 標(biāo)記是否已最小化 self.original_geometry = '' # 存儲(chǔ)原始窗口大小 # 最小化/最大化按鈕 self.toggle_btn = tk.Button(master, text="最小化", command=self.toggle) self.toggle_btn.pack() # 配置最小化時(shí)顯示的小窗口 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() # 初始時(shí)隱藏 # 最大化按鈕 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: # 如果當(dāng)前是最小化,恢復(fù)窗口 self.master.deiconify() # 顯示主窗口 self.master.geometry(self.original_geometry) # 恢復(fù)原始大小 self.mini_window.withdraw() # 隱藏最小化窗口 self.toggle_btn.config(text="最小化") self.minimized = False else: # 如果當(dāng)前是正常大小,最小化窗口 self.original_geometry = self.master.geometry() # 存儲(chǔ)當(dāng)前大小和位置 self.master.withdraw() # 隱藏主窗口 self.mini_window.deiconify() # 顯示最小化窗口 self.minimized = True def main(): root = tk.Tk() app = MinimizeApp(root) root.mainloop() if __name__ == "__main__": main()
上面的代碼可以實(shí)現(xiàn)一個(gè)自定義的最小化/最大化功能,首先創(chuàng)建一個(gè)最小化按鈕,當(dāng)用戶點(diǎn)擊這個(gè)按鈕時(shí),整個(gè)應(yīng)用窗口縮小至屏幕的右上角,并只顯示一個(gè)最大化按鈕。再次點(diǎn)擊這個(gè)最大化按鈕時(shí),窗口恢復(fù)到其原始大小。
我們通過手動(dòng)點(diǎn)擊的方式,管理窗口的大小和位置,以及按鈕的顯示和隱藏。
下一步是把以上代碼,融入到點(diǎn)名器1.0當(dāng)中,我們需要對(duì)這里的按紐對(duì)象名稱進(jìn)行修改,刪除與舊版相比重復(fù)的代碼,同時(shí)還要修復(fù)調(diào)試過程中的報(bào)錯(cuò)。
上課過程中,我又進(jìn)行了實(shí)地的測(cè)試,發(fā)現(xiàn)最小化后窗品沒有置于所有窗口的最前方,于是,我于向ChatGPT發(fā)問,如果設(shè)置最小化窗口前端顯示,它很快給了我下面的代碼:
self.mini_window.attributes('-topmost', 1)
果然,通過這個(gè)代碼,前置顯示問題很快解決了。
2. 為點(diǎn)名器添加朗讀功能
增加了最大最小化窗口的功能,我還想讓點(diǎn)名器自動(dòng)朗讀出點(diǎn)名器上的人名,這樣顯示的名字和朗讀的聲音匹配起來,可以最大可能地節(jié)省老師的時(shí)間和體力,進(jìn)一步提升講課的效率。
為了使軟件可以發(fā)聲,我們需要導(dǎo)入一個(gè)pyttsx3這個(gè)包,同時(shí)還要保證軟件聯(lián)網(wǎng)。
當(dāng)滾動(dòng)到顯示的人名時(shí),就會(huì)觸發(fā)朗讀的功能。當(dāng)然,也有人不想使用朗讀的功能,或者使用的電腦無法上網(wǎng),這時(shí)我們就需要增加一個(gè)復(fù)選框,用復(fù)選框來控制是否朗讀發(fā)聲。
我能過向ChatGPT提問得到了如下回復(fù):
增加復(fù)選框
接下來,我要做的是,在def __init__(self, master)這個(gè)初始化函數(shù)里,加上一個(gè)復(fù)選框代碼,同時(shí)通過檢測(cè)復(fù)選 框check_var的值,來控制是否朗讀發(fā)聲。注意這里的復(fù)選框不需要定義命令函數(shù)。
最后,在測(cè)試時(shí),我發(fā)現(xiàn)軟件不朗讀人名,后來才發(fā)現(xiàn)self.engine = pyttsx3.init()這個(gè)發(fā)聲引擎的初始化要在軟件界面初始化前啟動(dòng)。
3. 軟件使用展示
經(jīng)過中午和下午的修改測(cè)試,終于完成了新版點(diǎn)名器的雛形,如下圖所示:
4. 優(yōu)化后代碼
在增加朗讀、最小化等功能同時(shí),我征求網(wǎng)友的意見,又增加了姓名字體的自動(dòng)調(diào)節(jié)功能。而且,為了讓界面顯示的更好看,我把按紐居中顯示,最后形成以下軟件。
軟件代碼如下:
# 2023年4月10日更新1. 修復(fù)按紐點(diǎn)擊開始再點(diǎn)擊暫停2. 增加標(biāo)記功能 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("點(diǎn)名器 Gordon QQ:403096966") #self.master.resizable(False, False) #self.master.geometry("880x300") # 初始大小 self.minimized = False # 標(biāo)記是否已最小化 self.master.protocol("WM_DELETE_WINDOW", self.display_messagebox) # 彈窗提示確認(rèn)退出 self.master.attributes('-topmost', True) # 讀取文件中的名字 self.names = [] self.load_names() # 播放名字的控件 self.label_name = tk.Label(self.master, text="歡迎使用點(diǎn)名器", font=("Times New Roman", 90), fg="blue") self.label_name.pack(pady=50) #設(shè)置frame 居中顯示 button_frame = tk.Frame(self.master) button_frame.pack() items = ("加分","曠課", "遲到", "請(qǐng)假") self.combo = ttk.Combobox(button_frame, values=items, font=("宋體", 20),width=5) self.combo.set("加分") # 設(shè)置默認(rèn)值 self.combo.configure(font=("宋體", 20)) #設(shè)置字體大小寫 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) # 設(shè)置退出按鈕 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) # 設(shè)置標(biāo)記內(nèi)容 self.combo.pack(side=tk.LEFT, fill=tk.BOTH, padx=5) # 創(chuàng)建一個(gè)IntVar對(duì)象來存儲(chǔ)復(fù)選框的狀態(tài) self.check_var = tk.IntVar(value=0) # 默認(rèn)值設(shè)置為0(未選中) # 控制按鈕 self.button_mark = tk.Button(button_frame, text="標(biāo)記", font=("宋體", 20), width=9, command=self.write_txt) self.button_mark.pack(side=tk.LEFT,anchor="center",padx=20) # 創(chuàng)建復(fù)選框,綁定到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) # 配置最小化時(shí)顯示的小窗口 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() # 初始時(shí)隱藏 # 最大化按鈕 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 = "" #設(shè)置引擎 self.engine.setProperty('language', 'zh-CN') rate = self.engine.getProperty('rate') self.engine.setProperty('rate', rate - 50) # 設(shè)置發(fā)音大小,范圍為0.0-1.0 volume = self.engine.getProperty('volume') self.engine.setProperty('volume', 1.2) # 設(shè)置默認(rèn)的聲音: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號(hào)字 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: # 如果當(dāng)前是最小化,恢復(fù)窗口 self.master.deiconify() # 顯示主窗口 #self.master.geometry("880x300") # 初始大小 #self.master.geometry(self.original_geometry) # 恢復(fù)原始大小 self.mini_window.withdraw() # 隱藏最小化窗口 self.button_min.config(text="最小化") self.minimized = False else: # 如果當(dāng)前是正常大小,最小化窗口 self.original_geometry = self.master.geometry() # 存儲(chǔ)當(dāng)前大小和位置 self.master.withdraw() # 隱藏主窗口 self.mini_window.deiconify() # 顯示最小化窗口 self.mini_window.attributes('-topmost', 1) self.minimized = True def load_names(self): """從當(dāng)前目錄下的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("錯(cuò)誤","找不到names.txt,請(qǐng)把人名放到當(dāng)前目錄下的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("標(biāo)記內(nèi)容.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): """隨機(jī)選取一個(gè)名字播放""" 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): """彈窗提示是否確認(rèn)退出程序""" if messagebox.askokcancel("退出程序", "確定要退出程序嗎?"): self.master.destroy() if __name__ == "__main__": root = tk.Tk() app = RollCallApp(root) root.mainloop()
三、學(xué)后反思
本軟件最初編寫于去年的四月份,今年的二月突然有了新的靈感,短時(shí)間內(nèi)增加了二個(gè)不錯(cuò)的功能??磥碥浖木帉懸彩切枰欢〞r(shí)間的打磨。在汲取用戶意見的同時(shí),還要利用ChatGPT對(duì)原有的軟件進(jìn)行改造升級(jí)。
Python是當(dāng)下最熱門的編程語言,在人工智能領(lǐng)域發(fā)揮著不可替代的作用。它的擴(kuò)展性、靈活性極強(qiáng),可以實(shí)現(xiàn)跨平臺(tái)的應(yīng)用,被廣泛應(yīng)用于Web開發(fā)、網(wǎng)絡(luò)爬蟲、辦公自動(dòng)化等領(lǐng)域。因此,為自己的工作和生活帶來極大的便利,我建議大家盡早學(xué)習(xí)這門流行的語言。在ChatGPT的賦能下,每個(gè)人都可以借用于視頻、書本輕松學(xué)會(huì)它。
以上就是使用Python實(shí)現(xiàn)多功能課堂點(diǎn)名器與抽簽工具的詳細(xì)內(nèi)容,更多關(guān)于Python點(diǎn)名器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python基于similarities實(shí)現(xiàn)文本語義相似度計(jì)算和文本匹配搜索
similarities?實(shí)現(xiàn)了多種相似度計(jì)算、匹配搜索算法,支持文本、圖像,python3開發(fā),下面我們就來看看如何使用similarities實(shí)現(xiàn)文本語義相似度計(jì)算和文本匹配搜索吧2024-03-03基于python實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于python實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程
這篇文章主要介紹了以911新聞為例演示Python實(shí)現(xiàn)數(shù)據(jù)可視化的教程,主要基于NMF主題模型,需要的朋友可以參考下2015-04-04Python使用dict.fromkeys()快速生成一個(gè)字典示例
這篇文章主要介紹了Python使用dict.fromkeys()快速生成一個(gè)字典,結(jié)合實(shí)例形式分析了Python基于dict.fromkeys()生成字典的相關(guān)操作技巧,需要的朋友可以參考下2019-04-04基于Python的微信機(jī)器人開發(fā) 微信登錄和獲取好友列表實(shí)現(xiàn)解析
這篇文章主要介紹了Python微信機(jī)器人開發(fā) 微信登錄和獲取好友列表實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08