python - QSound 在对象内部的意外行为

标签 python python-3.x audio pyqt pyqt5

在为我的一个程序测试 QSound 期间,我遇到了一个我无法理解的问题。每当我在另一个对象中实现 QSound 对象时, play() 函数似乎无法调用 QSound 对象的成员变量。

下面是我用来分析问题的例子:

  1. 脚本中 QSound 的示例(按预期工作,重复 2 次声音)
from PyQt5.Qt import QApplication
from PyQt5.QtMultimedia import QSound
import sys

app=QApplication(sys.argv)

SoundObject=QSound("./path/sound.wav")

SoundObject.play()
SoundObject.play("./path/sound.wav")

sys.exit(app.exec())
  • 另一个对象内的 QSound 示例(仅重复一次声音)
  • from PyQt5.Qt import QApplication
    from PyQt5.QtMultimedia import QSound
    import sys
    
    app=QApplication(sys.argv)
    
    class SoundClass:
    
       def __init__(self):
    
            SoundObject = QSound("./path/sound.wav")
    
            print(SoundObject.fileName())  # output= "./path/sound.wav"
    
            SoundObject.play()  # this doesn't do anything
            SoundObject.play("./path/sound.wav") 
    
    SoundClass()
    
    sys.exit(app.exec())
    

    在这两种情况下,我都希望声音连续播放两次。然而,一旦我在另一个对象中使用 QSound 对象,“.play()”函数似乎会忽略我的对象的设置,而是调用静态函数 QSound.play()。 QSound 对象的其他成员变量(例如 setLoops/loops)也会出现相同的行为。

    在寻找问题的答案时,我发现了一个关于 C++ 和 Qt 的相同问题的线程。虽然有人提到 QSound 可能会被弃用,但没有明确的答案。 (我想知道为什么 4 年后它仍然是文档的一部分。)

    主题链接:QSound::play("soundpath") call works but a QSound object doesn't

    我使用了以下文档:https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtmultimedia/qsound.html?highlight=qsound#PyQt5.QtMultimedia.QSound

    我的规范:

    • Windows 10.0.17134.706
    • Python 3.7
    • PyQt 5.12

    我是否遗漏了一些重要的东西,或者这只是一个错误?

    最佳答案

    在第二段代码中,SoundObject 变量是一个局部变量,当构造函数执行完毕时,该变量将被删除,因此如果它是不依赖于任何对象的静态方法,则不会执行第一个播放,而是执行第二个播放。

     在第一个代码中,SoundObject 变量将在脚本完成时被删除,因为它的范围更大。

    解决方案是通过使其成为类的成员来扩大 SoundObject 的范围:

    from PyQt5.Qt import QApplication
    from PyQt5.QtMultimedia import QSound
    import sys
    
    app = QApplication(sys.argv)
    
    
    class SoundClass:
        def __init__(self):
            self.SoundObject = QSound("./path/sound.wav")
            print(self.SoundObject.fileName())  # output= "./path/sound.wav"
            self.SoundObject.play()  # this doesn't do anything
            self.SoundObject.play("./path/sound.wav")
    
    
    SoundClass()
    sys.exit(app.exec())
    

    关于python - QSound 在对象内部的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55801543/

    相关文章:

    python - GCP Dataproc - 西里尔字符在 python 中显示不正确

    python - 如何在 Tornado RequestHandler 中存储数据库 session

    python - 根据指示第二个列表中值的索引位置从嵌套列表中获取单个元素

    python - 与 mysql 的连接速度极慢

    javascript - 在网页上连续播放 mp3 的最有效方法(如网络 radio )

    audio - 如何以给定的分贝值衰减WAV文件?

    python - 独立应用程序上的 Django ORM

    python - 获取一系列值中的最后一个值以匹配 pandas 中的某些条件

    python - 根据日期列筛选和创建列

    javascript - 点击链接标签播放音效