Я строю GUI, что его целью является запуск нескольких тестов на контроллере. Мой оригинальный проект (который не приведен здесь, потому что он очень длинный, вместо этого я написал другой код, который, как мне кажется, демонстрирует, чего я хочу достичь), разделен на четыре части:
Пользовательский интерфейс файл, созданный с помощью конструктора - "file A"
Файл, содержащий класс. Его единственная цель - отправлять и получать сообщения на контроллер - "File B"
Файл, содержащий класс. Его единственная цель - получать информацию от работника, обрабатывать ее и отправлять обратно вычисления работнику - "File C"
Файл, который является рабочим файлом. Этот файл содержит функции GUI и класса Worker. - "File D"
Через этот файл я в основном передаю работнику информацию, затем работник отправляет эту информацию в файл C, возвращает ее и возвращает sh обратно в GUI. Как уже упоминалось, вся связь с контроллером осуществляется через работника с использованием функций, записанных в "File C"
Сейчас я борюсь с этим: допустим, я начинаю работать тест, но я хочу остановиться посередине. Я не могу понять, как это сделать.
Ниже приведен короткий код, с идеей, аналогичной описанной выше:
runstop.py
, как "File A"
, содержит конструктор вывод:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(311, 123)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(70, 50, 75, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(160, 50, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.lbl = QtWidgets.QLabel(self.centralwidget)
self.lbl.setGeometry(QtCore.QRect(70, 80, 75, 23))
self.lbl.setObjectName("lbl")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Start Timer"))
self.pushButton_2.setText(_translate("MainWindow", "Stop Timer"))
EX.py
похоже на "File C"
- в основном отправляет обратно некоторую информацию работнику:
from datetime import datetime
from PyQt5 import QtTest
class EX():
def __init__(self,lbl):
self.lbl=lbl
def time(self):
QtTest.QTest.qWait(1000)
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
self.lbl.setText(current_time)
runstopoper.py
похоже на "File D"
- оперативная часть проекта, содержащего также работника:
from runstop import Ui_MainWindow
from EX import EX
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
try:
import queue
except ImportError:
import Queue as queue
class Worker(QtCore.QRunnable):
def __init__(self,q,lbl):
super(Worker, self).__init__()
self.Q=q
print("worker up")
self.ex=EX(lbl)
def gettime(self):
self.ex.time()
class ApplicationWindow(QtWidgets.QMainWindow):
def __init__(self):
super(ApplicationWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.threadpool=QtCore.QThreadPool()
self.Q=queue.Queue()
self.ui.pushButton_2.setEnabled(False)
self.worker=Worker(self.Q,self.ui.lbl)
self.ui.pushButton.clicked.connect(self.startTime)
def startTime(self):
print("Started!")
self.ui.pushButton.setEnabled(False)
self.ui.pushButton_2.setEnabled(True)
self.timer = QtCore.QTimer()
self.timer.setInterval(1000)
self.timer.timeout.connect(self.updateTime)
self.timer.start()
def updateTime(self):
self.worker.gettime()
def stopTime(self):
print("stop?")
###how do I stop without stopping timer?###
def closeEvent(self,event):
sys.exit()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
application = ApplicationWindow()
application.show()
sys.exit(app.exec_())
Итак, мой вопрос, как я могу остановить работника, когда я нажимаю на кнопку остановки БЕЗ , чтобы остановить QTimer
? Я подумал, может быть, я смогу использовать QThreadPool
, чтобы остановить его, но не мог понять, как это сделать. Кроме того, я не хочу «убивать» весь рабочий, так как я хочу иметь возможность снова запустить таймер (и это невозможно без создания нового рабочего, но рабочий создается в init, а не при нажатии кнопки «Пуск»)
Надеюсь, все понятно - если нет, дайте мне знать, чтобы я мог предоставить больше информации. Любое предложение или идея будет очень цениться!
РЕДАКТИРОВАТЬ: я немного изменил код, чтобы сделать его немного более похожим на мой исходный код.