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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

2回答

4861閲覧

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

uc200

総合スコア32

Python 3.x

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

0グッド

0クリップ

投稿2017/11/25 05:50

編集2017/11/25 13:52

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

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

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

###該当のソースコード

python3

1import sys 2from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication 3from PyQt5 import QtCore, QtWidgets, QtMultimedia, QtGui 4 5 6 7player = QtMultimedia.QMediaPlayer() 8sound = QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile("sound.wav")) 9player.setMedia(sound) 10player.setVolume(100) 11 12 13class Example(QMainWindow): 14 15 def __init__(self): 16 super().__init__() 17 18 self.initUI() 19 20 21 def initUI(self): 22 23 btn1 = QPushButton("Button 1", self) 24 btn1.move(75, 50) 25 26 # クリックされたらbuttonClickedの呼び出し 27 btn1.clicked.connect(self.buttonClicked) 28 29 self.setGeometry(300, 300, 290, 150) 30 self.setWindowTitle('Event sender') 31 self.show() 32 33 34 def buttonClicked(self): 35 player.play() 36 37 38if __name__ == '__main__': 39 40 app = QApplication(sys.argv) 41 ex = Example() 42 sys.exit(app.exec_()) 43

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

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/ツール等のバージョンなど)
より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

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

python3

1import sys 2from PyQt5 import QtCore, QtWidgets, QtMultimedia 3 4class Window(QtWidgets.QWidget): 5 def __init__(self): 6 super(Window, self).__init__() 7 self.buttonOpen = QtWidgets.QPushButton('Open', self) 8 self.buttonOpen.clicked.connect(self.handleOpen) 9 self.buttonPlay = QtWidgets.QPushButton('Play', self) 10 self.buttonPlay.clicked.connect(self.handlePlay) 11 layout = QtWidgets.QHBoxLayout(self) 12 layout.addWidget(self.buttonOpen) 13 layout.addWidget(self.buttonPlay) 14 self.mediaPlayer = QtMultimedia.QMediaPlayer(self) 15 self._buffer = QtCore.QBuffer() 16 17 def handlePlay(self): 18 if self.buttonPlay.text() == 'Play': 19 self.buttonPlay.setText('Stop') 20 # self._buffer.seek(0) 21 self.mediaPlayer.play() 22 else: 23 self.buttonPlay.setText('Play') 24 self.mediaPlayer.stop() 25 26 def handleOpen(self): 27 path, ok = QtWidgets.QFileDialog.getOpenFileName( 28 self, filter='WAV Files (*.wav)') 29 if ok: 30 self._buffer.close() 31 with open(path, 'rb') as stream: 32 self._buffer.setData(stream.read()) 33 if self._buffer.open(QtCore.QIODevice.ReadOnly): 34 self.mediaPlayer.setMedia( 35 QtMultimedia.QMediaContent(), self._buffer) 36 37if __name__ == '__main__': 38 39 app = QtWidgets.QApplication(sys.argv) 40 window = Window() 41 window.setGeometry(600, 100, 200, 50) 42 window.show() 43 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/11/30 17:16

編集2017/12/03 07:09
uc200

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2017/11/25 06:45

can110

総合スコア38260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uc200

2017/11/25 13:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問