编译 PyQt5 错误:exe 文件找不到语音引擎?



当我运行这个脚本时,它运行得很好,但编译后,我在组合框列表中看不到任何texttospeech引擎。。。问题是关于版权或类似的东西?我尝试了很多方法来制作一个可执行文件,但仍然是一样的。。。


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtTextToSpeech import QTextToSpeech

self.pushButton.clicked.connect(self.say)

MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.engine = None
engineNames = QTextToSpeech.availableEngines()
if len(engineNames) > 0:
engineName = engineNames[0]
self.engine = QTextToSpeech(engineName)
self.engine.stateChanged.connect(self.stateChanged)

self.voices = []

for voice in self.engine.availableVoices():
self.voices.append(voice)
self.comboBox.addItem(voice.name())
else:
self.pushButton.setEnabled(True)

def say(self):
self.pushButton.setEnabled(True)
self.engine.setVoice(self.voices[self.comboBox.currentIndex()])
self.engine.setVolume(float(self.horizontalSlider.value() / 100))
self.engine.say(self.lineEdit.text())
def stateChanged(self, state):
if(state == QTextToSpeech.State.Ready):
self.pushButton.setEnabled(True)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Read"))
self.label_2.setText(_translate("MainWindow", "Select An Available Voice"))
self.label_3.setText(_translate("MainWindow", "Volume"))
self.pushButton.setText(_translate("MainWindow", "Read Aloud!"))

我能够使它与pyinstaller一起工作。我首先不会说你不应该编辑pyuic文件。

由于您没有提供一个工作示例,我创建了一个小脚本,它填补了代码中的一些空白,并能够将其作为单个文件安装来工作。


以下是我采取的步骤:

操作系统:Windows

  1. 创建一个新目录并将cd放入目录
  2. 打开名为texttospeech.py的新文件,并将下面的脚本粘贴到其中
  3. python -m venv venv
  4. python -m pip install --upgrade pip pyinstaller PyQt5
  5. pyinstaller -F --noconsole texttospeech.py
  6. 编辑.spec文件,使其与我下面包含的文件相同
  7. pyinstaller texttospeech.spec
  8. 只需运行dist/文件夹中的texttospeech.exe即可完成所有操作
# texttospeech.py
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtTextToSpeech import QTextToSpeech

class Window(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.pushButton = QtWidgets.QPushButton("button", self)
self.pushButton.clicked.connect(self.say)
self.central = QtWidgets.QWidget(self)
self.setCentralWidget(self.central)
self.comboBox = QtWidgets.QComboBox(self)
self.engine = None
engineNames = QTextToSpeech.availableEngines()
self.layout = QtWidgets.QVBoxLayout()
self.horizontalSlider = QtWidgets.QSlider(self)
self.lineEdit = QtWidgets.QLineEdit(self)
self.horizontalSlider.setOrientation(QtCore.Qt.Orientation.Horizontal)
self.central.setLayout(self.layout)
self.layout.addWidget(self.pushButton)
self.layout.addWidget(self.comboBox)
self.layout.addWidget(self.horizontalSlider)
self.layout.addWidget(self.lineEdit)
if len(engineNames) > 0:
self.engineName = engineNames[0]
self.engine = QTextToSpeech(self.engineName)
self.engine.stateChanged.connect(self.stateChanged)
self.voices = []
for voice in self.engine.availableVoices():
self.voices.append(voice)
self.comboBox.addItem(voice.name())
else:
self.pushButton.setEnabled(True)
def say(self):
self.pushButton.setEnabled(True)
self.engine.setVoice(self.voices[self.comboBox.currentIndex()])
self.engine.setVolume(float(self.horizontalSlider.value() / 100))
self.engine.say(self.lineEdit.text())
def stateChanged(self, state):
if(state == QTextToSpeech.State.Ready):
self.pushButton.setEnabled(True)
app = QtWidgets.QApplication([])
window = Window()
window.show()
app.exec_()

.spec文件:

# -*- mode: python ; coding: utf-8 -*-
# texttospeech.spec
import os
block_cipher = None
parent = os.path.abspath(os.getcwd())
modules = os.path.join(parent, "venv", "Lib", "site-packages")
qt5 = os.path.join(modules, "PyQt5")
a = Analysis(
['texttospeech.py'],
pathex=[],
binaries=[],
datas=[(qt5, "PyQt5")],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='texttospeech',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)

这背后的原因是pyinstallercx_Freeze在转换为EXE时错过了要导入的">texttospeech"文件夹。因此,您需要将创建的虚拟环境路径">env\Lib\site-packages\PyQt5\Qt5\plugins"中的">texttospeech文件夹"复制并粘贴到转换后的EXE文件文件夹路径">
Lib\PyQt5\ Qt5\pplugins。我完成了这个简单的步骤,然后它对我有效。如果这个评论有用,请点个赞。