質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • Python 3.x

    2410questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

【python3】pyqtでボタンを押した時に音が出るコードを書きたい

解決済

回答 2

投稿 2017/11/25 14:50 ・編集 2017/11/25 22:51

  • 評価
  • クリップ 0
  • VIEW 71

uc200

score 19

pyqt5でボタンを押した時に音が出るようにしたい

python3.5を使っています。pyqt5でボタンを押すと音が出るようなコードを書きたいです。

発生している問題・エラーメッセージ

ボタンを押しても音が出ません。エラーは特に表示されてないです。

該当のソースコード

import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication 
from PyQt5 import QtCore, QtWidgets, QtMultimedia, QtGui



player = QtMultimedia.QMediaPlayer()
sound = QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile("sound.wav"))
player.setMedia(sound)
player.setVolume(100)


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):      

        btn1 = QPushButton("Button 1", self)
        btn1.move(75, 50)

        # クリックされたらbuttonClickedの呼び出し
        btn1.clicked.connect(self.buttonClicked)            

        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Event sender')
        self.show()


    def buttonClicked(self):
        player.play()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

試したこと

音を出すコードとして、次の様なコードを書きました

from PyQt5 import QtCore, QtWidgets, QtMultimedia, QtGui
import sys

app = QtGui.QGuiApplication(sys.argv)
player = QtMultimedia.QMediaPlayer()
sound = QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile("sound.wav"))
player.setMedia(sound)
player.setVolume(100)
player.play()
sys.exit(app.exec_())


これ正常に動きました。次に、ボタンを押した時にコマンドを出すコードとして、次のようなコードがあったので、それを参考にしました。これは、クリック時にステータスバーの表示を変化させるコードです。

import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication


class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):      

        btn1 = QPushButton("Button 1", self)
        btn1.move(30, 50)

        btn2 = QPushButton("Button 2", self)
        btn2.move(150, 50)

        # クリックされたらbuttonClickedの呼び出し
        btn1.clicked.connect(self.buttonClicked)            
        btn2.clicked.connect(self.buttonClicked)

        self.statusBar()

        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Event sender')
        self.show()


    def buttonClicked(self):

        # ステータスバーへメッセージの表示
        sender = self.sender()
        self.statusBar().showMessage(sender.text() + ' was pressed')


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


これも正常に動きました。そこで、この二つのコードを参考に該当のコードを書いてみましたが、ボタンは表示されましたが、押しても何も起きませんでした。特にエラーは出ていません。

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

ネットを探してたら次の様なコードがありました。

import sys
from PyQt5 import QtCore, QtWidgets, QtMultimedia

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.buttonOpen = QtWidgets.QPushButton('Open', self)
        self.buttonOpen.clicked.connect(self.handleOpen)
        self.buttonPlay = QtWidgets.QPushButton('Play', self)
        self.buttonPlay.clicked.connect(self.handlePlay)
        layout = QtWidgets.QHBoxLayout(self)
        layout.addWidget(self.buttonOpen)
        layout.addWidget(self.buttonPlay)
        self.mediaPlayer = QtMultimedia.QMediaPlayer(self)
        self._buffer = QtCore.QBuffer()

    def handlePlay(self):
        if self.buttonPlay.text() == 'Play':
            self.buttonPlay.setText('Stop')
            # self._buffer.seek(0)
            self.mediaPlayer.play()
        else:
            self.buttonPlay.setText('Play')
            self.mediaPlayer.stop()

    def handleOpen(self):
        path, ok = QtWidgets.QFileDialog.getOpenFileName(
            self, filter='WAV Files (*.wav)')
        if ok:
            self._buffer.close()
            with open(path, 'rb') as stream:
                self._buffer.setData(stream.read())
            if self._buffer.open(QtCore.QIODevice.ReadOnly):
                self.mediaPlayer.setMedia(
                    QtMultimedia.QMediaContent(), self._buffer)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 200, 50)
    window.show()
    sys.exit(app.exec_())


これを参考にすればなんとか行けそうな気がします。もっと簡単に書ける方いたらご教授お願いします。

追記
とりあえず次の様なコードで動きました

import sys
from PyQt5 import QtCore, QtWidgets, QtMultimedia
from PyQt5.QtGui import QColor

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.buttonPlay = QtWidgets.QPushButton('Play', self)
        self.buttonPlay.clicked.connect(self.handlePlay)
        layout = QtWidgets.QHBoxLayout(self)
        layout.addWidget(self.buttonPlay)
        self.mediaPlayer = QtMultimedia.QMediaPlayer(self)
        sound=QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile("sound.wav"))
        self.mediaPlayer.setMedia(sound)


    def handlePlay(self):
        if self.buttonPlay.text() == 'Play':
            self.buttonPlay.setText('Stop')
            # self._buffer.seek(0)
            self.mediaPlayer.play()
        else:
            self.buttonPlay.setText('Play')
            self.mediaPlayer.stop()

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 200, 50)
    window.show()
    sys.exit(app.exec_())

追記
ボタンを任意の位置に表示できるようにしました
ボタンに音楽再生マークのラベルを付けました
ボタンを押した時に再び最初から音楽がなるようにしました

import sys
from PyQt5 import QtCore, QtWidgets, QtMultimedia
from PyQt5.QtGui import QColor
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.setWindowTitle("sound")
        self.setGeometry(500,300,100,100)

        btn = QPushButton(self)
        btn.setIcon(self.style().standardIcon(getattr(QStyle,"SP_MediaPlay")))
        btn.move(50, 25)  
        btn.clicked.connect(self.handlePlay)

        self.mediaPlayer = QtMultimedia.QMediaPlayer(self)
        sound=QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile("sound.wav"))
        self.mediaPlayer.setMedia(sound)

        self.show()


    def handlePlay(self):
        self.mediaPlayer.stop()
        self.mediaPlayer.play()


if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec_())

投稿 2017/12/01 02:16

編集 2017/12/03 16:09

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

動作未検証ですが気になる点だけ。
プログラムの最初にplay()してますね。ボタンを押したときはどこから再生されるのでしょうか?
以下ページを読むと解決方法が見つかるかもしれません。
QMediaPlayer Class

投稿 2017/11/25 15:45

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/25 22:54

    ご指摘ありがとうございます。早速play()をdef buttonClicked(self)の中に移しました(質問内の該当コードは修正しました)。しかし、まだボタンを押しても音は出ません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    2410questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。