音乐播放器

2023-05-16

完善音乐下载器时找到一个音乐播放器,自己完善了下

软件原作者:嘟嘟还没长大

完善内容

  • 支持文件拖动打开
  • 支持自动获取必应每日一图并显示
  • 随机播放支持选择路径

代码

import tkinter
from tkinter import Button
from tkinter import Label
from tkinter import Entry
from tkinter import Scale
from tkinter import Label, PhotoImage
from PIL import Image, ImageTk
from tkinter import messagebox
from tkinter import Toplevel
from pymediainfo import MediaInfo
import re
from tkinter import Message
import threading
import pygame
import time
import os
import sys
import random
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import askdirectory
from tkinter import StringVar
import requests
import json

top = tkinter.Tk()
top.geometry("800x400")
top.title("嘟嘟的音乐播放器")
top.state("zoomed")


def printsrceen(texts):
    t = int(texts)
    top.attributes("-alpha", t / 100)


screenwidth = top.winfo_screenwidth()
screenheight = top.winfo_screenheight() - 100

pygame.init()
path = StringVar()
paths = StringVar()
patht = StringVar()
v = StringVar()
v1 = StringVar()


def callback():  # 搜索本地文件
    path_ = askopenfilename()
    return path_


def selectPath():  # 随机播放
    folder_path = "D:/音乐"
    folder_list = os.listdir(folder_path)  # 遍历文件夹里面每个文件
    list = []
    count = 0
    for i in folder_list:  # 将文件夹里的文件按顺序传提给变量i  此处区别os.walk()
        if os.path.splitext(i)[1] == '.flac':  # 提取特定后缀文件'.***'
            list.append(i)
            # print(type(list))
            count = count + 1
    # print(count)

    s = random.randint(0, (count - 1))  # 获取随机数
    file = list[s]
    fil = folder_path + "\\" + file

    pygame.mixer.music.load(fil)
    pygame.mixer.music.play(1, 0)
    media_info = MediaInfo.parse(fil)
    data = media_info.to_json()  # medio到json()这两行是获取文件的所有属性
    rst = re.search('other_duration.*?(.*?)min(.*?)s.*?', data)
    t = int(rst.group(0)[19:20])
    r = int(rst.group(0)[-4:-2])
    m = (t * 60 + r) * 1000

    musictime = str(t) + ':' + str(r)
    l2.config(text=file)
    l3.config(text=musictime)
    lbTime = tkinter.Label(top, anchor='w')
    lbTime.place(x=25, y=150)

    def autoclose():
        for i in range(m // 1000):
            lbTime['text'] = '-{} /'.format((m // 1000) - i)
            time.sleep(1)

    t = threading.Thread(target=autoclose)
    t.start()
    loopl = top.after(m, selectPath)


def printScale(text):
    t = int(text)
    pygame.mixer.music.set_volume(t / 100)


def update_timeText():
    # Get the current time, note you can change the format as you wish
    current = time.strftime("%H:%M:%S")  # 获取当前时间

    # Update the timeText Label box with the current time
    timeText.configure(text=current)

    # Call the update_timeText() function after 1 second
    top.after(1000, update_timeText)


def remind():
    top = Toplevel()  # 新建一个tkinter窗口
    top.title('使用提示')
    top.geometry("200x200")
    t = "半分钟后开始播放音乐"
    msg = Message(top, text=t)
    msg.config(font=('times', 18, 'italic'))
    msg.place(x=0, y=0)
    lbTime = tkinter.Label(top, fg="red", anchor='w')
    lbTime.place(x=100, y=45)

    def autoclose():
        for i in range(30):
            lbTime['text'] = '距离窗口关闭还有{}秒'.format(30 - i)
            time.sleep(1)
        top.destroy()

    t = threading.Thread(target=autoclose)
    t.start()
    loopl = top.after(60 * 59500, remind)


def reminds():
    top = Toplevel()
    top.title('使用提示')
    top.geometry("200x200")
    t = "宝贝可以休息一会啦"
    msg = Message(top, text=t)
    msg.config(font=('times', 24, 'italic'))
    msg.place(x=0, y=0)
    folder_path = "D:/音乐"
    folder_list = os.listdir(folder_path)  # 遍历文件夹里面每个文件
    list = []
    count = 0
    for i in folder_list:  # 将文件夹里的文件按顺序传提给变量i  此处区别os.walk()
        if os.path.splitext(i)[1] == '.flac':  # 提取特定后缀文件'.***'
            list.append(i)
            # print(type(list))
            count = count + 1
        # print(count)
    s = random.randint(0, (count - 1))
    file = list[s]
    fil = folder_path + "\\" + file
    pygame.mixer.music.load(fil)
    pygame.mixer.music.play(1, 0)
    lbTime = tkinter.Label(top, fg="red", anchor='w')
    lbTime.place(x=100, y=45)

    def autoclose():
        for i in range(300):
            lbTime['text'] = '距离窗口关闭还有{}秒'.format(300 - i)
            time.sleep(1)
        top.destroy()

    t = threading.Thread(target=autoclose)
    t.start()
    loopl = top.after(60 * 60000, reminds)


def play():  # 播放音乐
    # 拖动音乐文件到程序图标,然后播放音乐
    if len(sys.argv) >= 2:  # 判断是否通过拖动音频文件打开程序
        f = sys.argv[1]  # 如果是,则播放拖动的文件
    else:
        f = callback()  # 若不是,则选择制定文件
    pygame.mixer.music.load(f)
    pygame.mixer.music.play()
    path.set(f)
    media_info = MediaInfo.parse(f)
    data = media_info.to_json()  # medio到json()这两行是获取文件的所有属性
    rst = re.search('other_duration.*?(.*?)min(.*?)s.*?', data)
    t = int(rst.group(0)[19:20])
    r = int(rst.group(0)[-4:-2])
    m = (t * 60 + r) * 1000
    musictime = str(t) + ':' + str(r)
    l2.config(text=f)
    l3.config(text=musictime)
    lbTime = tkinter.Label(top, anchor='w')
    lbTime.place(x=25, y=150)

    def autoclose():
        for i in range(m // 1000):
            lbTime['text'] = '-{} /'.format((m // 1000) - i)
            time.sleep(1)

    t = threading.Thread(target=autoclose)
    t.start()
    loopl = top.after(m, selectPath)


def stop():
    pygame.mixer.music.stop()  # 停止播放
    top.after_cancel(loopl)


def pause():
    pygame.mixer.music.pause()  # 暂停


def unpause():
    pygame.mixer.music.unpause()  # 继续播放


def refleshpic():  # 保存的路径不能有中文,若需要中文则吧/换成\
    global pic_copyright
    bing_api_res = requests.get("https://api.no0a.cn/api/bing/0")
    bing_api_dic = bing_api_res.json()
    print(bing_api_dic)
    pic_url = bing_api_dic['bing']['url']
    pic_copyright = bing_api_dic['bing']['copyright']
    pic_res = requests.get(pic_url)
    pic=pic_res.content
    f = open("./bing_img_cache.png", 'wb')
    f.write(pic)
    f.close()
    path_s = "./bing_img_cache.png"
    paths.set(path_s)
    img_open = Image.open(e1.get())
    img = ImageTk.PhotoImage(img_open)
    l1.config(image=img)
    l1.image = img


def create():
    top = Toplevel()
    top.title('使用提示')
    top.geometry("400x400")
    t = "关于照片,新建一个存放图片的文件,用英文命名,然后存里面的图片也用英文命名。关于音乐: 新建一个名字叫音乐的文件,把歌曲添加到该文件夹。"
    msg = Message(top, text=t)
    msg.config(font=('times', 24, 'italic'))
    msg.place(x=0, y=0)


def copyright():
    top = Toplevel()
    top.title('版权信息')
    top.geometry("500x400")
    t = """软件原作者为 嘟嘟还没长大
由 人工智障 完善
图片来自 必应:每日一图
本图版权信息 %s"""%(pic_copyright)
    msg = Message(top, text=t)
    msg.config(font=('times', 24, 'italic'))
    msg.place(x=0, y=0)


def loop():
    top.after(60 * 60000, reminds)
    top.after(60 * 59500, remind)


def loops():
    selectPath()


def gettime():
    t = time.strftime('%H%M%S')
    s = int(t[0:2])
    d = int(t[2:4])
    f = int(t[4:6])
    g = s * 60 * 60 + d * 60 + f
    return g


errmsg = 'Error!'
# 时间
timeText = Label(top, text="", font=("Helvetica", 15))
timeText.place(x=180, y=370)
update_timeText()
# 选择文件
Button(top, text="选择文件/播放", command=play, width=10, bg="sky blue").place(x=20, y=20)
Entry(top, text=path, width=25, state='readonly').place(x=120, y=20)

# 选择图片
Button(top, text='刷新图片', command=refleshpic, width=10, bg="sky blue").place(x=20, y=55)
e1 = Entry(top, text=paths, state='readonly', width=25)
e1.place(x=120, y=55)
l1 = Label(top)  # 图片放置位置
l1.place(x=320, y=0)

# 随机播放
Button(top, text="随机播放", command=selectPath, width=7, bg="sky blue").place(x=20, y=225)
l2 = Label(top, text='', width=25, font=("Helvetica", 16))  # 音乐名
l2.place(x=0, y=100)
Button(top, text="下一首", command=loops, width=5, bg="sky blue").place(x=100, y=225)
l3 = Label(top, text='', width=15)  # 音乐时长
l3.place(x=24, y=150)
# 暂停,继续播放,结束播放
Button(top, text="暂停", command=pause, width=7, bg="sky blue").place(x=170, y=245)
Button(top, text="继续播放", command=unpause, width=7, bg="sky blue").place(x=170, y=205)
Button(top, text="结束播放", command=stop, width=7, bg="sky blue").place(x=240, y=225)

# 提醒功能
Button(top, text='提醒功能', command=loop, width=10, bg="sky blue").place(x=20, y=325)
# 使用说明
Button(top, text="使用说明", command=create, width=10, bg="sky blue").place(x=20, y=370)
#版权信息
Button(top, text="版权信息", command=copyright, width=10, bg="sky blue").place(x=20, y=415)
# 音量
w1 = Scale(top, from_=0, to=100, orient="horizontal", length=75, variable=v, command=printScale, label="音量")
w1.place(x=240, y=145)

w2 = Scale(top, from_=30, to=100, orient="horizontal", length=100, variable=v1, command=printsrceen, label="透明度")
w2.place(x=150, y=290)

if len(sys.argv) >= 2:  # 初步判断是否通过拖动音频文件打开程序
    play()  # 如果是,则直接运行play()函数

refleshpic()

top.mainloop()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

音乐播放器 的相关文章

  • xrdp和vnc的区别

    在很多场景下 xff0c 我们需要远程连接到Linux服务器 本文是Ubuntu xff0c 传统的连接主要分为两种 第一种 xff1a 通过SSH服务 xff08 使用xshell等工具 xff09 来远程访问 xff0c 编写终端命令
  • 和风天气API数据分析

    注册和风天气获取key 请求数据时需要用到 xff0c 具体可查看文档 请求数据示例 3 10天天气预报 34 HeWeather6 34 34 basic 34 34 cid 34 34 CN101010100 34 34 locatio
  • 提供python接口有用的库

    python版本 windows上使用的是python2 7 2 32位版本 如何查看python是32位还是64位 xff1a import struct struct calcsize 34 P 34 如果是4 xff0c 说明是32位
  • Linux添加库路径的两种方法

    库文件在连接 静态库和共享库 和运行 仅限于使用共享库的程序 时被使用 xff0c 其搜索路径是在系统中进行设置的 一般 Linux 系统把 lib 和 usr lib 两个目录作为默认的库搜索路径 xff0c 所以使用这两个目录中的库时不
  • 动态库和静态库在编译C语言时使用方法简述

    函数库分为静态库和动态库两种 创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下 静态库在程序编译时会被连接到目标代码中 xff0c 程序运行时将不再需要该静态库 动态库在程序编译时并不会被连接到目标代码中 xff
  • Linux下的tar压缩解压缩命令详解

    tar c 建立压缩档案 x xff1a 解压 t xff1a 查看内容 r xff1a 向压缩归档文件末尾追加文件 u xff1a 更新原压缩包中的文件 这五个是独立的命令 xff0c 压缩解压都要用到其中一个 xff0c 可以和别的命令
  • Linux环境下安装MATLAB2012

    在GNU Debian环境下 xff0c 使用iso镜像安装Matlab2012 xff0c 首先需要用mount命令挂载镜像 xff0c mount o loop t iso9660 source mount point 具体的讲 mou
  • string与string.h以及cstring的关系区别

    c 43 43 中 string与string h 的作用和区别 如下代码 include lt string h gt void main string aaa 61 34 abcsd d 34 printf 34 looking for
  • gcc与g++的比较以及库的使用说明

    一 xff1a gcc与g 43 43 比较 编 译c c 43 43 代码的时候 xff0c 有人用gcc xff0c 有人用g 43 43 xff0c 于是各种说法都来了 xff0c 譬如c代码用gcc xff0c 而c 43 43 代
  • makefile 中的 wildcard 与 patsubst 函数

    makefile 里的函数跟它的变量很相似 使用的时候 xff0c 你用一个 符号跟开括号 xff0c 函数名 xff0c 空格后跟一列由逗号分隔的参数 xff0c 最后用关括号结束 例如 xff0c 在 GNU Make 里有一个叫 39
  • iOS大典之集合视图

    项目遇到了集合视图 感觉得整理下 又来一篇 遵守协议 span class hljs class span class hljs keyword 64 interface span span class hljs title RootVie
  • Github个人主页个性化定制1.0

    Github Your profile 个性化定制创建仓库基础内容特殊组件动态打字特效Github 信息展示个性化徽章访客数统计 常用素材EmojiIconsOthers 优秀案例参考文章 Github Your profile 个性化定制
  • git:获取远程分支到本地分支

    拉取 git pull origin 云端分支名 本地分支名 如 xff0c 拉取云端分支branch123 xff0c 拉到本地后命名该为同名bracnch123 git pull origin branch123 branch123 想
  • 【Android Studio】Gradle sync failed: Failed to open zip file

    问题及现象 Gradle sync failed Failed to open zip file Gradle 39 s dependency cache may be corrupt this sometimes occurs after
  • 【Linux】压缩工具-gzip

    span class token function gzip span f 文件绝对或相对路径 d
  • Android:ADB各类错误

    文章目录 need APK file on command lineFailure INSTALL FAILED SHARED USER INCOMPATIBLE Failure INSTALL FAILED UPDATE INCOMPAT
  • 头文件相互引用时,如何解决 error C2143、 error C4430甚至未定义符号、类型这些错误

    使用VS2010编写C程序 xff0c 主要是两个结构体定义出现了互相引用情况 xff0c 结构体类型 A B分别位于两个不同的头文件中 xff0c 但是A B出现了相互引用的情况 xff0c 即在A结构体定义中 xff0c 用到了B xf

随机推荐

  • 译文:dBA和dBC的不同

    原文 xff1a The Difference Between dBA and dBC 作者 xff1a Malinda Zellman 分贝 xff0c 也被称为dB xff0c 是声音等级的度量单位 xff0c 用于通讯 电子和信号以及
  • AndroidStudio:Annotation processors must be explicitly declared now.【已解决】

    Time xff1a 2019年5月27日 Android Studio xff1a 3 4 1 文章目录 问题解决 问题 在导入lombok依赖时 xff0c 遇到以下问题 xff1a Annotation processors must
  • Lombok:使用@Builder注解,无法调用builder()方法

    文章目录 VSCodeAndroid Studio 在学习easyExcel xff08 JAVA葵花宝典推送的犬小哈 惊了 xff01 7 行代码优雅地实现 Excel 文件导出功能 xff1f xff09 过程中 xff0c 看到用了l
  • Android:Duplicate class inxmlbeans-2.6.0.jar【已解决】

    Time xff1a 2019年5月28日 Android Studio xff1a 3 4 1 还是在瞅easyExcel的时候 xff0c 出现Duplicate class found in modules xmlbeans 2 6
  • WSL:访问Windows目录

    Time xff1a 20190704 Env xff1a WSL Ubuntu 在Windows的WSL中访问Windows的目录 span class token function cd span mnt 可以看到盘符 进入之后就可以访
  • ExpRe[18] 手动构建Docker镜像[1] 指定cuda、python包版本

    文章目录 指定cuda版本准备miniconda创建环境 xff0c 指定包版本使用 96 git clone b 96 指定分支并安装 总结和问答练习 时效性 本篇撰写时间为2021 12 9 xff0c 由于计算机技术日新月异 xff0
  • 资料分享:TI AM5708平台特点和典型应用

    此文章原创来源于 xff1a 创龙电子 产品简介 xff1a AM5708开发板是一款由创龙基于TI AM570x浮点DSP C66x 43 ARM Cortex A15工业控制及可编程音视频处理器 由SOM TL570x核心板设计的开发板
  • Linux系统的休眠与唤醒简介

    转文地址 xff1a http blog 163 com jiaguang3010717 64 126 blog static 1268082432010310103037253 系统挂起 xff08 Suspend xff09 是电源管理
  • intellij idea cpu占用率太大太满 运行速度太慢 使了五个解决方法最终成功

    突然发现 xff0c intellij idea 特别卡 xff0c 在代码间移动的时候 xff0c 居然刷新都跟不上 xff0c 然后打开任务管理器一看 xff0c CPU占用率100 intellij idea自己一个程序的占用率就高达
  • Ubuntu21.04安装cuda10.2和cudnn

    系统 xff1a Ubuntu21 04 显卡 xff1a NVIDIA 1080Ti cuda是NVIDIA公司设计用来加速GPU训练的 xff0c 而cudnn则是可以把cuda应用到深度学习领域 xff0c 如果想用GPU跑深度神经网
  • 基于C语言的状态机实现技术

    一 简介 有限状态机是一种用来进行对象行为建模的工具 xff0c 其作用主要是描述对象在它的生命周期内所经历的状态序列 xff0c 以及如何响应来自外界的各种事件 有限状态机 xff08 Finite State Machine或者Fini
  • wampserve详细安装教程(手把手教你搭建)

    前提提醒 xff1a 如果你为纯小白直接按照操作步骤进行即可 xff08 忽略进阶教程 xff09 xff0c 如果你知道进阶教程是什么可参照教程中的非小白步骤 使用前请关闭其他本地环境软件 xff0c 否则会出现冲突 该教程为本地环境搭建
  • Ubuntu18.04扩展home目录分区记录

    前言 最近Ubuntu18 04系统的home目录空间不够用了 xff0c 之前安装系统的时候 xff0c 给home分配的空间只占了根目录的很小一部分 xff0c 因此就想把根目录的空余空间转给home 涉及到系统分区调整 xff0c 因
  • 优化后亲测可用!免费下载QQ音乐大部分资源

    音乐下载器 优化后亲测可用 xff01 免费下载QQ音乐大部分资源 眼看着网上许多下歌的插件用不了了 xff0c 又不想买VIP xff0c 便非常着急 突然我想到了接口这玩意儿 xff0c 于是我 奥我真是个人才 xff01 突然我看见了
  • 自动祝福程序(定时发送消息)

    有个同学找我帮忙 xff1a 明天是她朋友的生日 xff0c 但她没时间发送祝福 xff0c 问我能不能弄个自动发送 我想 xff0c QQ并没有内置的定时发送功能 xff0c 紧接着又想起了QQ刷屏助手 xff08 见我以前的博文 xff
  • 停更

    停更CSDN CSDN是我的第一个博客 xff0c 它也很完美 xff0c 但我的博客经常没能通过它的审核 xff0c 用起来很不爽 因此 xff0c 我决定停更CSDN xff0c 以后的博客都将发布到博客园 新博客链接 https ww
  • 停更规则更新

    我觉得嘛 来这里写东西点击量更高 所以以后软件不在这里发 其他的东西我还是会更新的 xff01 另外 xff0c 我会设定从WordPress个人博客上进行博客搬家 xff0c 不过 xff0c 除了上面所谓的 其他东西 以外 xff0c
  • 免费建站记

    好久不见 xff01 另外 xff0c 我可能还会发布一篇国内操作系统的测评记录 xff08 会不会发布取决于我写不写得完 xff09 首先 xff0c 这篇文章是从我个人博客上搬运的 xff0c 所以可能有些地方会有格式上的不正确 xff
  • 如果没有Linux,这个世界会怎样?

    众所周知 xff0c Linux是一个开源的操作系统 自从它流行起来 xff0c 微软就渐渐失去了地位 Linux在我们生活中的每一处 xff0c 但是 xff0c 假如没有Linux这一些开源操作系统 xff0c 会发生什么 xff1f
  • 音乐播放器

    完善音乐下载器时找到一个音乐播放器 xff0c 自己完善了下 软件原作者 xff1a 嘟嘟还没长大 完善内容 支持文件拖动打开 支持自动获取必应每日一图并显示 随机播放支持选择路径 代码 span class token keyword i