回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【Mind+Python】我爱唱红歌 简单

头像 qayz 2021.08.22 363 1

一、 创作灵感

红歌不仅歌词美,而且一首红歌就是一段历史,唱红歌可以使我们受到红色教育,在红歌中汲取丰富的营养。然而随着时间的推移,许多人渐渐忘记了红歌。基于此,我用python编程软件,利用内置库tkinter以及第三方库pygame,设计制作了这款作品,希望通过猜歌的方式让人们记住红歌、记住历史。

二、作品功能

作品主界面由管理员板块和用户板块,管理员通过用户名和密码验证登陆,可以查看红歌、添加红歌、删除红歌,主要是对红歌进行管理。用户通过单击进入按钮即可进入猜歌页面,在该页面主要实现的功能有:音量设置、随机抽歌、播放与暂停、猜歌、显示结果、显示分数等。

三、制作过程

步骤1 算法设计

project-image

步骤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、主界面

project-image

效果图

代码
    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、管理员登陆界面

project-image
代码
  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、管理员操作界面

project-image

效果图

代码
    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、猜歌页面

project-image
代码
 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()

四、演示视频

评论

user-avatar
  • qayz

    qayz2021.08.22

    ??

    0