Python功能制作之简单的音乐播放器

news2024/9/23 21:31:06

需要导入的库:

pip install PyQt5

源码:

import os
from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QSlider, QListWidget, QVBoxLayout, QWidget, QPushButton

class MusicPlayer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Music Player")
        self.setWindowIcon(QIcon("icon.png"))
        self.resize(800, 600)

        self.current_song = None
        self.playing = False

        self.song_list_view = QListWidget()
        self.song_list_view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)

        self.current_song_label = QLabel()
        self.current_song_label.setAlignment(Qt.AlignCenter)
        self.current_song_label.setPixmap(QPixmap("default.jpg"))

        self.progress_slider = QSlider(Qt.Horizontal)
        self.progress_slider.setEnabled(False)

        self.play_button = QPushButton()
        self.play_button.setIcon(QIcon("play.png"))
        self.play_button.clicked.connect(self.play_or_pause)

        layout = QVBoxLayout()
        layout.addWidget(self.song_list_view)
        layout.addWidget(self.current_song_label)
        layout.addWidget(self.progress_slider)
        layout.addWidget(self.play_button)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        self.player = QMediaPlayer()
        self.player.stateChanged.connect(self.update_playback_state)

        self.load_song_list()

    def load_song_list(self):
        song_list = os.listdir("video")
        self.song_list_view.clear()
        self.song_list_view.addItems(song_list)
        self.song_list_view.itemDoubleClicked.connect(self.play_song)

    def play_song(self, item):
        song_name = item.text()
        if self.current_song:
            self.player.stop()
            self.current_song = None
        self.player.setMedia(QMediaContent(QUrl.fromLocalFile("video/{}".format(song_name))))
        self.current_song = song_name
        self.player.play()
        self.playing = True
        self.current_song_label.setPixmap(QPixmap("video/{}.jpg".format(song_name.split(".")[0])))
        self.setWindowTitle("Music Player - {}".format(song_name.split(".")[0]))
        self.play_button.setIcon(QIcon("pause.png"))  # 更新播放按钮的图标为暂停图标

    def stop_song(self):
        self.player.stop()
        self.current_song = None
        self.playing = False
        self.current_song_label.setPixmap(QPixmap("default.jpg"))
        self.setWindowTitle("Music Player")
        self.play_button.setIcon(QIcon("play.png"))  # 更新播放按钮的图标为播放图标

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Space:
            if self.current_song:
                if self.playing:
                    self.player.pause()
                    self.playing = False
                    self.play_button.setIcon(QIcon("play.png"))  # 更新播放按钮的图标为播放图标
                else:
                    self.player.play()
                    self.playing = True
                    self.play_button.setIcon(QIcon("pause.png"))  # 更新播放按钮的图标为暂停图标

    def play_or_pause(self):
        if self.current_song:
            if self.playing:
                self.player.pause()
                self.playing = False
                self.play_button.setIcon(QIcon("play.png"))  # 更新播放按钮的图标为播放图标
            else:
                self.player.play()
                self.playing = True
                self.play_button.setIcon(QIcon("pause.png"))  # 更新播放按钮的图标为暂停图标

    def update_playback_state(self, state):
        if state == QMediaPlayer.PlayingState:
            self.playing = True
            self.setWindowTitle("Music Player - Playing")
        elif state == QMediaPlayer.PausedState:
            self.playing = False
            self.setWindowTitle("Music Player - Paused")
        elif state == QMediaPlayer.StoppedState:
            self.playing = False
            self.setWindowTitle("Music Player")

    def closeEvent(self, event):
        self.player.stop()
        event.accept()

if __name__ == "__main__":
    app = QApplication([])
    player = MusicPlayer()
    player.show()
    app.exec()

效果:

双击列表歌曲即播放。

按住下面的暂停和播放【需要图标】【空格也可以】

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/908448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT-3.5——从 人工智障 到 大人工智障

有人说,GPT是从人工智障到人工智能的蜕变,但是。。。 我认为,GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…

MySQL高级篇——MySQL架构篇1(Linux下MySQL8的安装与使用)

目录 0 安装前0.1 Linux系统及工具的准备0.2 查看是否安装过MySQL0.3 MySQL的卸载 1 MySQL8的Linux版安装1.1 MySQL的4大版本1.2 下载MySQL指定版本1.3 CentOS7下检查MySQL依赖1.4 CentOS7下MySQL安装过程 2 MySQL登录2.1 首次登录2.2 修改密码2.3 设置远程登录 3 MySQL 8 的密…

Jmeter —— 自动录制脚本

目录 目录 1、Jmeter配置 1.1新增一个线程组 1.2Jmeter中添加HTTP代理 1.3配置HTTP代理服务器 2、录制脚本 2.1配置本地代理 2.2访问页面进行操作 2.3脚本处理 1、Jmeter配置 1.1新增一个线程组 1.2Jmeter中添加HTTP代理 1.3配置HTTP代理服务器 修改端口 修改Target…

嵌入式基础知识-中断处理过程

本篇来介绍中断,这是计算机系统以及嵌入式系统的重要概念。 1 中断基本概念 中断是CPU对系统发生的某个事件作出的一种反应。 中断的一些基本概念: 中断源:引起中断的事件称为中断源中断请求:中断源向CPU提出处理的请求称为中断…

excel文本函数篇1

本期主要介绍LEFT、RIGHT、MID以及后面加B的情况: (1)后缀没有B:一个字节代表一个中文字符 (2)后缀有B:两个字节代表一个中文字符 (3)LEFT()从前面开始找,RI…

【腾讯云 TDSQL-C Serverless 产品体验】基于腾讯云轻量服务器以及 TDSQL-C 搭建 LNMP WordPress 博客系统

文章目录 一、前言二、数据库发展与云原生数据库2.1 数据库发展简介2.2 云原生数据库简介2.2.1 云数据库与云原生数据库区别 三、腾讯云 TDSQL-C 数据库3.1 什么是腾讯云 TDSQL-C 数据库3.2 为什么推出 TDSQL-C 数据库?传统 MySQL 架构存在较多痛点3.2.1 传统 MySQL…

【Linux】cpolar+JuiceSSH实现手机端远程连接Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

Amelia预订插件:WordPress企业级预约系统

并非所有WordPress预订插件都像他们所设计的那样。其中一些缺乏运行高效预约操作所需的功能,而其他一些则看起来陈旧过时。您不需要其中任何一个,但Amelia预订插件似乎希望确保所有用户都对功能和风格感到满意。 在这篇Amelia企业级预约系统插件评测中&…

内网渗透神器CobaltStrike之BOF编写(十一)

前言 Beacon Object File(BOF) 从Cobalt Strike4.1开始所添加的新功能,它允许你使用C语言编写扩展来扩展Beacon的功能。这些扩展可以在运行时直接加载到Beacon的内存中并执行,无需在目标机器的磁盘上创建任何文件 BOF的一个关键特性是它的运行时环境非…

生物识别技术与身份认证:探讨生物识别技术在强化身份认证和访问控制方面的应用

第一章:引言 在数字化时代,随着信息技术的飞速发展,身份认证和访问控制变得越来越重要。传统的用户名和密码方式逐渐暴露出安全性不足的问题,为此,生物识别技术应运而生。生物识别技术利用人体生物特征来识别个体身份…

HoudiniVex笔记_P25_ForceExtended力进阶

原视频:https://www.youtube.com/playlist?listPLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI Bili:Houdini最强VEX算法教程 - VEX for Algorithmic Design_哔哩哔哩_bilibili Houdini版本:19.5 如有错误,可在评论区指正。 1、本章主要…

sql数据导出到excel

一、打开Navicat Premium 12 二、导出

管理类联考——逻辑——真题篇——按知识分类——汇总篇——三、综合推理——是否确定信息

真题(2018-40)——综合推理——是否确定信息——确定信息——以确定信息作为解题起点 某海军部队有甲、乙、丙、丁、戊、己、庚7艘舰艇,拟组成两个编队出航,第一编队编列3艘舰艇,第二编队编列4艘舰艇,编列…

linux的http服务

Web通信基本概念 基于B/S(Browser/Server)架构的网页服务 服务端提供网页 浏览器下载并显示网页 Hyper Text Markup Lanuage,超文本标记语言 Hyper Text Transfer Protocol,超文本传输协议 虚拟机A:构建基本的Web服务 [root…

python Requests

Requests概述 官方文档:http://cn.python-requests.org/zh_CN/latest/,Requests是python的HTTP的库,我们可以安全的使用 Requests安装 pip install Requests -i https://pypi.tuna.tsinghua.edu.cn/simple Requests的使用 Respose的属性 属性说明url响…

Jeep车型数据源:提供Jeep品牌车系、车型、价格、配置等信息

​​​​​ Jeep是一个极具特色的汽车品牌,它的所有车型都注重实用性,具有越野性能和高性能。Jeep品牌在汽车行业中的口碑一直是非常不错的。如果你想要了解Jeep品牌车系、车型、价格、配置等信息,就可以通过挖数据平台Jeep车型数据源API接口…

IO day 5

1、使用两个线程完成两个文件的拷贝&#xff0c;主线程拷贝前一半内容&#xff0c;子线程拷贝后一半内容&#xff0c;并且主线程要阻塞回收子线程资源 #include <myhead.h>//定义求文件长度函数 int fd1,fd2; //以只读的形式打开源文件 if((fd1open(stcfile,O_RDONLY)) …

aosp-刷入Magisk面具获取root权限

作者&#xff1a;上山打鼠 一、简介 话说上次root手机都已经是初中的时候了&#xff0c;那时候捣鼓手机不亦乐乎&#xff0c;Android4.4的系统先解锁&#xff0c;再刷入第三方Recovery&#xff0c;然后再刷入Root包去获取Root权限 想学点逆向的知识&#xff0c;所以要root一下…

算法通关村第5关【青铜】| Hash和队列的特征

1.Hash基础 &#xff08;1&#xff09;基础 哈希也称为散列&#xff0c;通过算法变成固定长度的输出值&#xff0c;存入对应的位置 例如这个算法为取模算法&#xff0c;indexnumber 模 7 存入1到15 &#xff08;2&#xff09;碰撞处理 当多个元素映射到同一位置上时就产生…

L Grayscale Confusion【2023牛客多校第10场】【拓扑排序】

来源&#xff1a;“范式杯”2023牛客暑期多校训练营10 —— L Grayscale Confusion 题意&#xff1a;给定 n 个三元组 ( r i , g i , b i ) 。构造一个长度为 n 的数组 w&#xff0c; 使得 ①w1 w 2 ②对于任意 i, j &#xff0c;若 r i > r j , g i > g …