Как работать с QThread в python

У меня есть файл main.py, в котором логика моей программы. Также у меня есть файл gui.py, в котором весь ui программы (скомпилен с file.ui).

Я хотел что бы появлялся новый поток при нажатии на кнопку допустим:

def main():
    #что то делать

def thread_fun():
    #вызвать тут поток

button.clicked.connect(thread_fun)

как бы я мог организовать это ?


Ответы (1 шт):

Автор решения: S. Nick

Пожалуйста ВСЕГДА ! предоставьте минимальный воспроизводимый пример

Отправка электронной почты занимает некоторое время, поэтому графический интерфейс можно заблокировать, поэтому отправка должна выполняться в потоке, например так:

import sys
import threading
from PyQt5 import QtCore, QtGui, QtWidgets

import smtplib
from email.mime.text      import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base      import MIMEBase
from email                import encoders


def send_email(user, pwd, recipient, subject, body):
    msg = MIMEMultipart()
    msg['From']    = user
    msg['To']      = recipient
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))
    text = msg.as_string()

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(user, pwd)
    server.sendmail(user, recipient, text)
    server.quit()


class EmailDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(EmailDialog, self).__init__(parent)
        lay = QtWidgets.QFormLayout(self)
        self.from_le    = QtWidgets.QLineEdit("[email protected]")
        self.pass_le    = QtWidgets.QLineEdit("passwordUserFrom", echoMode=QtWidgets.QLineEdit.Password)
        self.to_le      = QtWidgets.QLineEdit("[email protected]")
        self.subject_le = QtWidgets.QLineEdit("Тема передаваемого сообщения: Важное сообщение.")
        self.body_te    = QtWidgets.QTextEdit("Текст передаваемого сообщения: Привет Мир!")

        self.buttonBox = QtWidgets.QDialogButtonBox()
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.accepted.connect(self.accept)
        self.buttonBox.rejected.connect(self.reject)

        lay.addRow("From: ", self.from_le)
        lay.addRow("Password: ", self.pass_le)
        lay.addRow("To: ", self.to_le)
        lay.addRow("Subject: ", self.subject_le)
        lay.addRow("Body: ", self.body_te)
        lay.addRow(self.buttonBox)

        self.from_le.textChanged.connect(self.enable_button)
        self.pass_le.textChanged.connect(self.enable_button)
        self.to_le.textChanged.connect(self.enable_button)
        self.enable_button()

    def enable_button(self):
        disabled = self.from_le.text() == "" or self.pass_le.text() == "" or self.to_le.text() == ""
        self.buttonBox.setDisabled(disabled)

    def get_data(self):
        return self.from_le.text(), self.pass_le.text(), self.to_le.text(), \
               self.subject_le.text(), self.body_te.toPlainText()


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        
        self.view = QtWidgets.QLabel()
        self.view.setFixedSize(540, 300)
        self.btn_send = QtWidgets.QPushButton("Send Email")
        self.btn_send.clicked.connect(self.send_start)
        
        lay = QtWidgets.QVBoxLayout(central_widget)
        lay.addWidget(self.view, alignment=QtCore.Qt.AlignCenter)
        lay.addWidget(self.btn_send)
       
        self._info = None
        self.show()
        self.init_email()

    def init_email(self):
        d = EmailDialog(self)
        if d.exec_() == EmailDialog.Accepted:
            self._info = d.get_data()

    def send_start(self):
        if self._info:
            th = threading.Thread(target=send_email, args=(*self._info,)) 
            th.start()            


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

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

→ Ссылка