一、 创作灵感
红歌不仅歌词美,而且一首红歌就是一段历史,唱红歌可以使我们受到红色教育,在红歌中汲取丰富的营养。然而随着时间的推移,许多人渐渐忘记了红歌。基于此,我用python编程软件,利用内置库tkinter以及第三方库pygame,设计制作了这款作品,希望通过猜歌的方式让人们记住红歌、记住历史。
二、作品功能
作品主界面由管理员板块和用户板块,管理员通过用户名和密码验证登陆,可以查看红歌、添加红歌、删除红歌,主要是对红歌进行管理。用户通过单击进入按钮即可进入猜歌页面,在该页面主要实现的功能有:音量设置、随机抽歌、播放与暂停、猜歌、显示结果、显示分数等。
三、制作过程
步骤1 算法设计
步骤2 程序设计
1、导入库
根据项目设计思路,项目需要tkinter库用于界面的设计、pygame库用户红歌的加载与播放、random库用户随机抽取歌曲、tkinter.filedialog用户打开文件对话框的实现,具体导入方法如下:
代码
import tkinter as tk
from tkinter import ttk
import tkinter.messagebox as msg
from tkinter import *
import pygame
import random
from tkinter.filedialog import *
2、主界面
效果图
代码
def __init__(self,window):
pygame.init()
pygame.mixer.init()
self.win=window
self.win.title("我爱唱红歌")
self.win.geometry("550x350+330+200")
#定义静态显示信息
frame=tk.LabelFrame(self.win,text='我爱唱红歌—传承红色基因,献礼建党百年',font=("华文行楷",20,),fg="red")
frame.grid(row=0,column=0,padx=10,pady=10)
label_title=tk.Label(frame,text="作品名称:我爱唱红歌",font=("华文行楷",18),fg="green")
label_title.grid(row=0,column=0,padx=6,pady=6,sticky="w")
label_t = tk.Label(frame, text="作者:魏鹏飞", font=("华文行楷", 18), fg="green")
label_t.grid(row=2, column=0, padx=6, pady=6, sticky="w")
#定义登陆界面
frame_login=tk.LabelFrame(self.win,text="用户登陆",font=("华文行楷",20),fg="red")
frame_login.grid(row=1,column=0,padx=10,pady=40,sticky="w")
tk.Button(frame_login,text="管理员",command=self.admin,width=12,font=("华文行楷",18)).grid(row=0,column=0,padx=6,pady=6)
tk.Button(frame_login,text="用户",command=self.enter_top,width=12,font=("华文行楷",18)).grid(row=0,column=1,padx=6,pady=6)
tk.Button(frame_login, text="退出", command=self.win.quit, width=12, font=("华文行楷", 18)).grid(row=0, column=2, padx=6, pady=6)
主界面实现代码
3、管理员登陆界面
代码
def admin(self):
self.admin_win=tk.Toplevel()
self.admin_win.title("管理员登陆界面")
tk.Label(self.admin_win,text="用户名:",font=("华文行楷",14)).grid(row=0,column=0,padx=6,pady=10,sticky="w")
tk.Label(self.admin_win, text="密码:", font=("华文行楷",14)).grid(row=1, column=0, padx=6, pady=10, sticky="w")
self.user_name_value=tk.StringVar()
self.user_psw_value=tk.StringVar()
self.user_name = tk.Entry(self.admin_win, font=("华文行楷", 14),textvariable=self.user_name_value)
self.user_name.grid(row=0, column=1, padx=6, pady=6, sticky="e")
self.user_psw = tk.Entry(self.admin_win, font=("华文行楷", 14),show="*",textvariable=self.user_psw_value)
self.user_psw.grid(row=1, column=1, padx=6, pady=6, sticky="e")
tk.Button(self.admin_win,text="登陆",font=("华文行楷",14),width=10,command=self.admin_login).grid(row=2,column=0,padx=6,pady=6)
tk.Button(self.admin_win, text="退出", font=("华文行楷", 14), width=10, command=self.admin_win.destroy).grid(row=2, column=1, padx=6,
pady=10)
#管理员登陆验证
def admin_login(self):
if self.user_name_value.get()!="" or self.user_psw_value.get()!="":
if self.user_name_value.get()=="admin" and self.user_psw_value.get()=="123456":
self.admin_win.destroy()
msg.showinfo("提示","欢迎管理员{}登陆".format(self.user_name_value.get()))
self.admin_update()
else:
msg.showerror("错误","用户名或者密码错误,请重新登陆")
self.user_name_value.set("")
self.user_psw_value.set("")
else:
msg.showwarning("警告","用户名或密码不能为空")
4、管理员操作界面
效果图
代码
def admin_update(self):
self.admin_update_win=tk.Toplevel()
self.admin_update_win.title("管理员操作页面")
label_frame=tk.LabelFrame(self.admin_update_win,text="管理红歌",font=("华文行楷",14),fg="red")
label_frame.grid(row=0,column=0,padx=10,pady=10)
tk.Button(label_frame,text="选择歌曲",font=("华文行楷",14),command=self.choice_music).grid(row=0,column=2,padx=10,pady=10)
self.new_sing_name=tk.StringVar()
tk.Entry(label_frame,font=("华文行楷",14),textvariable=self.new_sing_name).grid(row=0,columnspan=2,padx=10,pady=10)
tk.Button(label_frame,text="添加",command=self.add_sing,font=("华文行楷",14),width=10).grid(row=1,column=0,padx=5,pady=10)
tk.Button(label_frame, text="退出", command=self.admin_update_win.destroy, font=("华文行楷", 14), width=10).grid(row=1, column=2,pady=10,padx=5)
tk.Button(label_frame, text="删除", command=self.delete_sing, font=("华文行楷", 14),
width=10).grid(row=1, column=1, pady=10,padx=5)
show_frame=tk.LabelFrame(self.admin_update_win,text="红歌列表",font=("华文行楷",14),fg="red")
show_frame.grid(row=1,column=0,pady=10,sticky="w")
self.list_box=tk.Listbox(show_frame,font=("华文行楷",14),width=40)
self.list_box.grid(row=0,column=0,pady=10,padx=10,sticky="w")
for item in self.music_list:
self.list_box.insert("end",item)
def choice_music(self):
self.file_path=askopenfilename()
self.s_cut = self.file_path[-4:]
if self.new_sing_name.get() != " ":
if self.s_cut == ".wav":
self.new_sing_name.set(self.file_path) # 设置变量filename的值
self.new_name=self.file_path.split('/')[-1][:-4]
else:
msg.showerror("错误", "请选择图片格式的文件")
else:
msg.showerror("提示", "请选择需要识别的图片")
实现代码
5、添加红歌
代码
#添加歌曲
def add_sing(self):
if self.new_sing_name.get()!="":
self.new=self.new_sing_name.get().split("/")[-1][:-4]
if self.new not in self.music_list:
self.music_list.append(self.new)
self.list_box.insert("end",self.new)
msg.showinfo("提示","红歌{}添加成功".format(self.new))
else:
msg.showerror("错误","红歌{}已存在,无法再次插入".format(self.new))
else:
msg.showerror("错误","请先输入歌名")
6、删除红歌
代码
#删除歌曲
def delete_sing(self):
if self.list_box.curselection():
self.index=self.list_box.curselection()
del self.music_list[self.index[0]]
self.list_box.delete(self.list_box.curselection())
msg.showinfo("提示","红歌删除成功")
else:
msg.showerror("提示","先选中要删除的红歌")
7、猜歌页面
代码
def enter_top(self):
self.top_win=tk.Toplevel()
self.top_win.title("猜歌页面")
tk.Label(self.top_win,text="设置音量",font=("华文行楷",18),fg="red").grid(row=0,column=0,padx=5,pady=5)
self.scale=tk.Scale(self.top_win,
label="设置音量",
from_=0,
to=100,
length=500,
orient=tk.HORIZONTAL,
tickinterval=10,
)
self.scale.grid(row=0,column=1,padx=10,pady=10)
tk.Button(self.top_win,text="播放/暂停",command=self.play_music,font=("华文行楷",14)).grid(row=1,column=1,padx=6,pady=6,sticky="w")
tk.Label(self.top_win,text="请输入歌名:",font=("华文行楷",14)).grid(row=2,column=0,padx=6,pady=10)
self.sing_name=tk.StringVar()
tk.Entry(self.top_win,font=("华文行楷",14),textvariable=self.sing_name).grid(row=2,column=1,sticky="w")
tk.Button(self.top_win, text="确定", command=self.guess_music_name, font=("华文行楷", 14),width=10).grid(row=3, column=0, padx=6, pady=6,sticky="w")
self.show_result=tk.Label(self.top_win, text="显示结果", font=("华文行楷", 14),bg="red")
self.show_result.grid(row=3, column=1, padx=6, pady=10,sticky="w")
tk.Button(self.top_win,text="随机抽歌",command=self.choise_music,font=("华文行楷",14)).grid(row=1,column=0,padx=6,pady=6,sticky="w")
tk.Label(self.top_win,text="Score:",font=("华文行楷",16)).grid(row=4,column=0)
self.label_score=tk.Label(self.top_win,text="显示成绩",font=("华文行楷",14),bg="red")
self.label_score.grid(row=4,column=1,sticky="w")
8、随机出歌
代码
#随机生成歌曲
def choise_music(self):
self.music_name=random.choice(self.music_list)
self.play_sound = pygame.mixer.Sound("红歌/"+self.music_name+".wav")
msg.showinfo("提示","随机歌曲成功,单击播放/暂停按钮开始猜歌名")
self.play_sound.set_volume(0.5)
8、播放/暂停
代码
#点播/暂停
def play_music(self):
self.flag+= 1
if self.flag % 2==0:
try:
self.play_sound.play(loops=-1)
except AttributeError as e:
msg.showerror("提示","请先抽取红歌")
else:
self.play_sound.stop()
9、猜歌
代码
#猜歌
def guess_music_name(self):
if self.sing_name.get() !="":
if self.sing_name.get()==self.music_name:
self.show_result["bg"] = "red"
self.show_result["text"]="恭喜你答对了"
self.score+=1
self.label_score["text"]=self.score
self.sing_name.set("")
else:
self.show_result["bg"] = "red"
self.show_result["text"] = "很遗憾,您答错了,正确的歌名为:{}".format(self.music_name)
self.sing_name.set("")
else:
self.show_result["bg"] = "red"
self.show_result["text"] = "请先输入歌名"
self.sing_name.set("")
10、程序入口
代码
if __name__=="__main__":
window=tk.Tk()
app=App(window)
window.mainloop()
四、演示视频
qayz2021.08.22
??