如何解决Python PyQt在创建exe文件时,界面中的任何动作都会重新启动exe文件
我有一个带有 PyQt5 接口的 python 脚本 main.py。我使用开始按钮运行随机生成行的 test.py 脚本,然后将数据输出到 textEdit。为此,我使用了 QProcess 和 pyqtSignal。当我运行 main.py 脚本并按下开始按钮时,一切正常。 然后我决定使用 cx_freeze 从 main.py 创建一个 exe 文件,我也使用了 pyinstaller。 exe文件被创建,界面被启动,但是当按下开始按钮时,程序被重新启动,而不是我上面描述的动作。控制台中没有错误。 告诉我可能是什么问题以及如何修复它,或者如何将错误输出到控制台以查看问题。
main.py
from functools import cached_property
from pathlib import Path
from PyQt5 import QtGui,QtWidgets,QtCore
from PyQt5.Qt import *
from collections import deque
import interface
import os
import sys
CURRENT_DIRECTORY = Path(__file__).resolve().parent
class MainWindow(QtWidgets.QMainWindow,interface.Ui_MainWindow):
def __init__(self):
super().__init__()
QtWidgets.QMainWindow.__init__(self)
self.setupUi(self)
self.pushButtonStop.setEnabled
self.pushButtonStart.clicked.connect(self.handle_start)
self.pushButtonStop.clicked.connect(self.handle_stop)
self.manager.standard_output_changed.connect(self.process_data)
self.manager.standard_error_changed.connect(self.process_data)
self.manager.running_changed.connect(self.handle_running_changed)
def closeEvent(self,event):
reply = QMessageBox.question(self,"Quit","quit?",QMessageBox.Yes,QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
def handle_start(self):
number_of_processes = self.spinBox.value()
for _ in range(number_of_processes):
self.manager.append(
sys.executable,[os.fspath(CURRENT_DIRECTORY / "test2.py")]
)
def handle_stop(self):
self.manager.stop()
def handle_running_changed(self):
self.pushButtonStop.setEnabled(self.manager.running)
@cached_property
def manager(self):
return TaskManager()
def process_data(self,data):
codec = QtCore.QTextCodec.codecForLocale()
decoder_stdout = codec.makeDecoder()
text = decoder_stdout.toUnicode(data)
self.textEdit.append(text)
class TaskManager(QtCore.QObject):
standard_output_changed = QtCore.pyqtSignal(QtCore.QByteArray)
standard_error_changed = QtCore.pyqtSignal(QtCore.QByteArray)
running_changed = QtCore.pyqtSignal()
_running = False
@cached_property
def process(self):
process = QtCore.QProcess()
process.readyReadStandardOutput.connect(self.handle_standard_output)
process.readyReadStandardError.connect(self.handle_standard_error)
process.finished.connect(self.try_start)
return process
@cached_property
def queue(self):
return deque()
@property
def running(self):
return self._running
@running.setter
def running(self,running):
if self.running == running:
return
self._running = running
self.running_changed.emit()
def append(self,program,arguments=()):
self.queue.append((program,arguments))
self.try_start()
def try_start(self):
if len(self.queue) == 0:
self.running = False
return
if self.process.state() == QtCore.QProcess.NotRunning:
program,arguments = self.queue.popleft()
self.process.setProgram(program)
self.process.setArguments(arguments)
self.process.start()
self.running = True
def handle_standard_output(self):
self.standard_output_changed.emit(self.process.readAllStandardOutput())
def handle_standard_error(self):
self.standard_error_changed.emit(self.process.readAllStandardError())
def stop(self):
if self.process.state() != QtCore.QProcess.NotRunning:
self.process.kill()
self.queue.clear()
self.running = False
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec())
接口.py
from PyQt5 import QtCore,QtGui,QtWidgets
class Ui_MainWindow(object):
def setupUi(self,MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(851,300)
MainWindow.setStyleSheet("")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setStyleSheet("")
self.centralwidget.setObjectName("centralwidget")
self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(10,131,271))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.verticalLayout.setContentsMargins(0,0)
self.verticalLayout.setObjectName("verticalLayout")
self.pushButtonStart = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.pushButtonStart.setEnabled(True)
font = QtGui.QFont()
font.setPointSize(10)
font.setStyleStrategy(QtGui.QFont.PreferDefault)
self.pushButtonStart.setFont(font)
self.pushButtonStart.setStyleSheet("border-radius : 10;\n"
"border : 2px;")
self.pushButtonStart.setObjectName("pushButtonStart")
self.verticalLayout.addWidget(self.pushButtonStart)
self.pushButtonStop = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.pushButtonStop.setEnabled(False)
font = QtGui.QFont()
font.setPointSize(10)
self.pushButtonStop.setFont(font)
self.pushButtonStop.setStyleSheet("border-radius : 10;\n"
"border : 2px;")
self.pushButtonStop.setObjectName("pushButtonStop")
self.verticalLayout.addWidget(self.pushButtonStop)
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.spinBox = QtWidgets.QSpinBox(self.verticalLayoutWidget)
self.spinBox.setMinimum(1)
self.spinBox.setMaximum(9999)
self.spinBox.setProperty("value",1)
self.spinBox.setObjectName("spinBox")
self.gridLayout_2.addWidget(self.spinBox,1,1)
self.label_6 = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label_6.setObjectName("label_6")
self.gridLayout_2.addWidget(self.label_6,1)
self.verticalLayout.addLayout(self.gridLayout_2)
self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(150,691,291))
self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
self.verticalLayout_2.setContentsMargins(0,0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.tabWidget = QtWidgets.QTabWidget(self.verticalLayoutWidget_2)
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.tabWidget.setFont(font)
self.tabWidget.setStyleSheet("")
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setMaximumSize(QtCore.QSize(16777215,16777215))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(False)
font.setWeight(50)
self.tab.setFont(font)
self.tab.setStyleSheet("")
self.tab.setObjectName("tab")
self.layoutWidget = QtWidgets.QWidget(self.tab)
self.layoutWidget.setGeometry(QtCore.QRect(0,681,251))
self.layoutWidget.setObjectName("layoutWidget")
self.gridLayout_8 = QtWidgets.QGridLayout(self.layoutWidget)
self.gridLayout_8.setContentsMargins(0,0)
self.gridLayout_8.setObjectName("gridLayout_8")
self.textEdit = QtWidgets.QTextEdit(self.layoutWidget)
self.textEdit.setStyleSheet("")
self.textEdit.setReadOnly(True)
self.textEdit.setObjectName("textEdit")
self.gridLayout_8.addWidget(self.textEdit,1)
self.tabWidget.addTab(self.tab,"")
self.verticalLayout_2.addWidget(self.tabWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self,MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow","test"))
self.pushButtonStart.setText(_translate("MainWindow","Start"))
self.pushButtonStop.setText(_translate("MainWindow","Stop"))
self.label_6.setText(_translate("MainWindow","Value"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab),_translate("MainWindow","Log"))
test.py
import random
import string
domains = ["hotmail.com","gmail.com","yandex.ru","mail.ru","list.ru","yahoo.com"]
letters = string.ascii_lowercase[:12]
def get_random_domain(domains):
return random.choice(domains)
def get_random_name(letters,length):
return ''.join(random.choice(letters) for i in range(length))
def generate_random_emails(nb,length):
return [get_random_name(letters,length) + '@' + get_random_domain(domains) for i in range(nb)]
def main():
print(generate_random_emails(1,12))
if __name__ == "__main__":
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。