所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开

【Mind+Python】我爱唱红歌

qayz qayz 2021-08-23 09:12:01
0
1
简单

一、 创作灵感 

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

二、作品功能

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

三、制作过程

步骤1 步骤1
算法设计
projectImage
步骤2 步骤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、主界面

projectImage

效果图

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

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

projectImage

效果图

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

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

四、演示视频

Makelog作者原创文章,未经授权禁止转载。
0
1
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
|
[[c.comment_content]]