QSoundEffect()超出全局范围时不播放声音

2024-10-03 13:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个应用程序,将文件从一个目录复制到另一个目录。我希望它在过程结束时发出声音。当QSoundEffect在某个函数或类中时,我不知道如何使它产生声音。只有当代码如下所示时,它才会起作用:

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *


app = QApplication(sys.argv)
win = QMainWindow()

filepath = "C:\Windows\Media\Windows Error.wav"
sound = QSoundEffect()
sound.setSource(QUrl.fromLocalFile(filepath))
sound.play()
    
win.show()
sys.exit(app.exec_())

当代码看起来像这样时,为什么它不工作?如何使它在函数或类中工作

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *


def play_sound():
    filepath = "C:\Windows\Media\Windows Error.wav"
    sound = QSoundEffect()
    sound.setSource(QUrl.fromLocalFile(filepath))
    sound.play()


app = QApplication(sys.argv)
win = QMainWindow()
    
play_sound()

win.show()
sys.exit(app.exec_())

Tags: 函数代码fromimport目录appplaywindows
1条回答
网友
1楼 · 发布于 2024-10-03 13:22:42

问题是“声音”是play_sound函数的局部变量,因此当该方法完成几乎是瞬时的执行时,它将被消除

解决方案是延长生命周期:

  • Python风格:使用全局变量

    sound = None
    
    def play_sound():
        filepath = "C:\Windows\Media\Windows Error.wav"
        global sound
        sound = QSoundEffect()
        sound.setSource(QUrl.fromLocalFile(filepath))
        sound.play()
    
  • Qt样式:设置父项

    def play_sound():
        filepath = "C:\Windows\Media\Windows Error.wav"
        sound = QSoundEffect(QCoreApplication.instance())
        sound.setSource(QUrl.fromLocalFile(filepath))
        sound.play()
    

相关问题 更多 >