Запустить тему QT при нажатии кнопки - PullRequest
0 голосов
/ 23 марта 2020

Это пример кода только с кнопкой pu sh и textedit, мне нужно написать строку x line, используя al oop в textedit при нажатии кнопки.

Проблема в том, что мне нужно реализовать потоки, потому что без них программа падает или не записывает строку x, но все вместе, когда заканчивается l oop; и мне нужно реализовать в моем приложении textedit, который показывает информацию, в то время как программа загружает «что-то».

Итак, мой вопрос, как переписать этот код, используя потоки для записи в textedit при нажатии кнопки? Метод, который я должен запустить при нажатии кнопки - «написать», он должен работать как печать внутри a для l oop, он печатал бы не все сразу

  from PyQt5 import QtCore, QtGui, QtWidgets



  class Ui_MainWindow(object):

   def setupUi(self, MainWindow):

    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(640, 480)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
    self.textEdit.setGeometry(QtCore.QRect(150, 220, 321, 71))
    self.textEdit.setObjectName("textEdit")
    self.pushButton = QtWidgets.QPushButton(self.centralwidget)
    self.pushButton.setGeometry(QtCore.QRect(240, 100, 75, 23))
    self.pushButton.setObjectName("pushButton")
    MainWindow.setCentralWidget(self.centralwidget)
    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 21))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")

    MainWindow.setStatusBar(self.statusbar)
    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", "PushButton"))
    self.pushButton.clicked.connect(self.write)

  def write(self):
    string=""
    for i in range(1000):
        string="\n"+str(i)
        self.textEdit.insertPlainText(string)

import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

1 Ответ

0 голосов
/ 23 марта 2020

Прежде всего, рекомендуется не изменять класс, сгенерированный Qt Designer, поэтому вы должны сгенерировать файл и предположить, что он называется mainwindow.py: pyuic5 your_file.ui -o mainwindow.py -x.

Учитывая вышесказанное, логика c должна генерировать информацию в другом потоке и отправлять ее в GUI для ее изменения:

main.py

import threading

from PyQt5 import QtCore, QtGui, QtWidgets

from mainwindow import Ui_MainWindow


class WriterWorker(QtCore.QObject):
    textChanged = QtCore.pyqtSignal(str)

    def start(self):
        threading.Thread(target=self._execute, daemon=True).start()

    def _execute(self):
        string = ""
        for i in range(1000):
            string = "\n"+str(i)
            self.textChanged.emit(string)


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.writer_worker = WriterWorker()
        self.writer_worker.textChanged.connect(self.on_text_changed)
        self.pushButton.clicked.connect(self.writer_worker.start)

    @QtCore.pyqtSlot(str)
    def on_text_changed(self, text):
        self.textEdit.insertPlainText(text)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...