Как сделать так, чтобы при нажатии кнопку проигрывался звук?

Рейтинг: 1Ответов: 1Опубликовано: 29.07.2023

Я написал банальный кликер с помощью Qt Designer и привязал функции к кнопкам.
Недавно захотел привязать к этим же кнопкам звук проигрывания.
Привязал, но при нажатии на кнопку программа сразу же завершается.

Я не понимаю в чём дело. Звук проигрывается с помощью библиотеки winsound.

from PyQt5 import QtCore, QtGui, QtWidgets
import webbrowser
import sys
import winsound

cl = 0

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setGeometry(800, 360, 250, 250)
        MainWindow.setFixedSize(250, 250)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.author = QtWidgets.QPushButton(self.centralwidget)
        self.author.setGeometry(QtCore.QRect(160, 0, 89, 23))
        self.author.setMaximumSize(QtCore.QSize(91, 23))
        self.author.setAutoFillBackground(False)
        self.author.setStyleSheet("font: 8pt \"Algerian\";")
        self.author.setAutoRepeat(False)
        self.author.setAutoExclusive(False)
        self.author.setFlat(True)
        self.author.setObjectName("author")
        self.clicks = QtWidgets.QLabel(self.centralwidget)
        self.clicks.setGeometry(QtCore.QRect(40, 10, 191, 111))
        font = QtGui.QFont()
        font.setFamily("Biff")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.clicks.setFont(font)
        self.clicks.setStyleSheet("color: rgb(25, 170, 0);\n"
                              "font: 20pt \"Biff\";")
        self.clicks.setObjectName("clicks")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(60, 100, 131, 111))
        self.pushButton.setStyleSheet("background-color: rgb(255, 0, 0);")
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.add_func()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Кликер 2.0"))
        self.author.setText(_translate("MainWindow", "fanat skiLLa1"))
        self.clicks.setText(_translate("MainWindow", "CLICKS: 0"))

    def add_func(self):
        self.author.clicked.connect(self.url)
        self.pushButton.clicked.connect(self.clickess)

    def url(self):
        webbrowser.open('https://vk.com/idbat9cs16', new=2)  # Открытие вкладки в браузере

    def clickess(self):
        winsound.PlaySound('Sounds/btn_sound.wav', False)  # Проигрывание звука нажатия кнопки
        global cl
        cl += 1  # Счётчик кликов
        self.clicks.setText(f'CLICKS: {cl}')


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Так же прикрепил ошибку, которая возникает при нажатии кнопки (точнее это не ошибка, но всё же может быть это поможет):

C:\python\python.exe "D:\python\clicker 2.0.py"

Process finished with exit code -1073740791 (0xC0000409)

Ответы

▲ 2Принят

Хотя ваш код у меня отработал без ошибок, дам вам некоторые рекомендации:

  • НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА.
    Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.

  • Чтобы получить реальную ошибку, я рекомендую выполнить скрипт в терминале / CMD, так как многие IDE не обрабатывают исключения Qt.

  • Не рекомендуется злоупотреблять глобальными переменными, как указано в разделе Почему глобальные переменные - зло?

main.py

import sys
import winsound
import webbrowser
from PyQt5 import QtCore, QtGui, QtWidgets


#cl = 0

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setGeometry(800, 360, 250, 250)
        MainWindow.setFixedSize(250, 250)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.author = QtWidgets.QPushButton(self.centralwidget)
        self.author.setGeometry(QtCore.QRect(160, 0, 89, 23))
        self.author.setMaximumSize(QtCore.QSize(91, 23))
        self.author.setAutoFillBackground(False)
        self.author.setStyleSheet("font: 8pt \"Algerian\";")
        self.author.setAutoRepeat(False)
        self.author.setAutoExclusive(False)
        self.author.setFlat(True)
        self.author.setObjectName("author")
        self.clicks = QtWidgets.QLabel(self.centralwidget)
        self.clicks.setGeometry(QtCore.QRect(40, 10, 191, 111))
        font = QtGui.QFont()
        font.setFamily("Biff")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.clicks.setFont(font)
        self.clicks.setStyleSheet("color: rgb(25, 170, 0);\n"
                              "font: 20pt \"Biff\";")
        self.clicks.setObjectName("clicks")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(60, 100, 131, 111))
        self.pushButton.setStyleSheet("background-color: rgb(255, 0, 0);")
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Кликер 2.0"))
        self.author.setText(_translate("MainWindow", "fanat skiLLa1"))
        self.clicks.setText(_translate("MainWindow", "CLICKS: 0"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow ):                               # !!! +++
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)
        
        self.cl = 0                                                          # !!! +++
        
        self.add_func()
        
    def add_func(self):
        self.author.clicked.connect(self.url)
        self.pushButton.clicked.connect(self.clickess)

    def url(self):
# ----> установите свое  vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv <---------- !!!  
        webbrowser.open('https://ru.stackoverflow.com/questions/1533168', new=2)  

    def clickess(self):
# -------> установите свое  vvvvvvvvvvvvvvv <-------------------------------------- !!! 
        winsound.PlaySound('sounds/shot.wav', False)  
#        global cl
        self.cl += 1  # Счётчик кликов                                       # +++ self
        self.clicks.setText(f'CLICKS: {self.cl}')


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения