跳至正文
View Categories

2 min read

主要内容 #

  • 滑动条操作模块
  • 播放模式切换操作模块
  • 1. 滑动条操作模块 #

    以下程序完成的功能是:两个滑动条(播放进度和音量)的操作模块。
    当拖动滑动条时,对应的音乐进度或者音量会被调整到对应位置上。

    
    		def change_volume(self, value):
    			"""
    			修改音量
    			"""
    			self.player.setVolume(value)

    完成音乐文件的音量滑动条按钮操作后,还需要设计一个按钮。
    将该按钮与对应的功能进行连接。
    程序如下:

    
        # 在self.init()中找到如下这部分代码
        # --播放进度控制
        self.play_slider = QSlider(Qt.Horizontal, self) # 播放slider
    
        # 并且在下一行增加如下这段代码
    	self.play_slider.sliderMoved[int].connect(
    	            lambda: self.player.setPosition(
    	                self.play_slider.value())) # 播放slider的操作处理,当拖动进度条时,播放对应位置
    					
        # 在self.init()中找到如下这部分代码
        # --音量控制
        self.volume_slider = QSlider(Qt.Horizontal, self) # 音量控制slider
        self.volume_slider.setFocusPolicy(Qt.NoFocus) # 不聚焦
    	
    	# 并且在下一行增加如下这段代码
    	self.volume_slider.valueChanged[int].connect(self.change_volume) # 设置改变音量的代码

    将以上所有代码加入到MusicPlayer类中,并且在self.init()函数中做好相应的修改。
    再次运行程序,查看具体效果。

    2. 播放模式切换操作模块 #

    以下程序将完成音乐播放器中的最后一部分的功能:播放模式的选择。
    总共有三种模式:顺序播放,单曲循环,以及随机播放。

    
        def play_by_mode(self):
            """
            根据播放模式播放音乐
            """
            if (not self.is_pause) and (not self.is_switching):
                self.play_slider.setMinimum(0) # 最小值从0开始
                self.play_slider.setMaximum(self.player.duration()) # 最大值为当前歌曲的长度
                self.play_slider.setValue(self.play_slider.value() + 1000)
            self.time_slider_1.setText(
                time.strftime(
                    '%M:%S',
                    time.localtime(
                        self.player.position() /
                        1000))) # 当前播放时间的数字设置
            self.time_slider_2.setText(
                time.strftime(
                    '%M:%S',
                    time.localtime(
                        self.player.duration() /
                        1000))) # 最大播放时间的数字设置
            # 顺序播放
            if (self.cmb_mode.currentIndex() == 0) and (
                    not self.is_pause) and (not self.is_switching):
                if self.qlist.count() == 0:
                    return
                if self.player.position() == self.player.duration():
                    self.next_music() # 顺序播放的核心就是当当前播放结束时,直接跳转到下一首
            # 单曲循环
            elif (self.cmb_mode.currentIndex() == 1) and (not self.is_pause) and (not self.is_switching):
                if self.qlist.count() == 0:
                    return
                if self.player.position() == self.player.duration(): # 单曲循环的核心就是当当前播放结束后,继续播放当前音乐
                    self.is_switching = True
                    self.set_cur_playing()
                    self.play_slider.setValue(0)
                    self.play_music()
                    self.is_switching = False
            # 随机播放
            elif (self.cmb_mode.currentIndex() == 2) and (not self.is_pause) and (not self.is_switching):
                if self.qlist.count() == 0:
                    return
                if self.player.position() == self.player.duration():
                    self.is_switching = True
                    self.qlist.setCurrentRow(
                        random.randint(
                            0, self.qlist.count() - 1)) # 随机播放的核心是当当前播放结束后,随机选择一个音乐进行播放
                    self.set_cur_playing()
                    self.play_slider.setValue(0)
                    self.play_music()
                    self.is_switching = False

    完成功能后,还需要设计一个按钮。
    将该按钮与对应的功能进行连接。
    程序如下:

    
        # 在self.init()中找到如下这部分代码
    	# --计时器
        self.timer = QTimer(self) # 设置计时器,当当前音乐播放结束之后,计时器timeout,之后根据播放模式跳到下一首
        self.timer.start(1000)
    
        # 并且在下一行增加如下这段代码
    	self.timer.timeout.connect(self.play_by_mode) # 播放模式选择

    将以上所有代码加入到MusicPlayer类中,并且在self.init()函数中做好相应的修改。
    再次运行程序,查看具体效果。

    3. 小结 #

    • 本章完成了音乐播放器的滑动条操作模块
    • 本章完成了音乐播放器的播放模式切换操作模块

    习题 #