簡體   English   中英

如何從屬於 MainWindow 類的 QlineEdit 中讀取文本,並使用 python 和 pyqt 將其用於 Qthread 類?

[英]How to read text from a QlineEdit which belongs to a MainWindow class, and use it into a Qthread class using python and pyqt?

我是 python 和 pyqt 的新手,我正在開發一個應用程序,但遇到了一個問題。 我正在構建一個通過郵件發送.csv文件的QThread類,昨天一位成員向我展示了如何將str信號發送到在主窗口中找到的 QtextBrowser。 現在我需要閱讀 3 個QlineEdit ,其中包含服務器地址、用戶名和密碼。 但似乎我不太明白如何從這些中讀取str並將其發送到我需要的地方。

3 QlineEdit被稱為: server_lineuser_linepass_line並且當我嘗試使用此self.server_line.displayText()在主窗口中讀取它們時工作正常,但是當我嘗試從class MailSender讀取它們時,我收到錯誤QPixmap: It is not safe to use pixmaps outside the GUI thread 我知道我必須使用信號和插槽,但在這種情況下我不知道該怎么做。

讓我向您展示我的代碼的簡短版本:

import sys,os,time
import psutil,threading
from smtplib import SMTP
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email import Encoders
import email.utils
from PyQt4 import QtGui, uic ,QtSql,QtCore
from PyQt4.QtCore import QThread, SIGNAL
from PyQt4.QtGui import *
from uuid import getnode as get_mac
import base64
from reportlab.pdfgen import canvas
import StringIO
from reportlab.lib.pagesizes import landscape
from reportlab.lib.pagesizes import letter
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.lib.units import inch
import icons

class MailSender(QtCore.QThread):
    newMessage = QtCore.pyqtSignal(str)
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)

    def __del__(self):
        self.wait()

    def serverVal(self,val):
        self.server = val

    def clasa_MyWindow(self):
        self.clasa = MyWindow()


    def mail_send(self):
        #server = smtp mail server address and port
        #user = mail user
        #pass1 = mail password
        try:
            msg = MIMEMultipart('Inchideri .')
            msg['Subject'] = 'Inchideri '
            msg['From'] = (str(user + '@mail.ro'))
            msg['To'] = (str(destinatar))
            # -------------------------------------------------------
            mail_file = MIMEBase('application', 'csv')
            mail_file.set_payload(open("Raport.csv", 'rb').read())
            mail_file.add_header('Content-Disposition', 'attachment', filename="Raport.csv")
            Encoders.encode_base64(mail_file)
            msg.attach(mail_file)
            # ------------------------------------------------------
            conn = SMTP(str(server))
            conn.set_debuglevel(False)
            conn.login(str(user), str(pass1))
            try:
                conn.sendmail(str(user + '@mail.ro'), str(destinatar), msg.as_string())
                self.newMessage.emit("Sending Mail.....")
            finally:
                conn.quit()
                self.newMessage.emit("Mail Send OK")
        except Exception, exc:
            self.newMessage.emit("mail failed; %s" % str(exc))  # give a error message

    def run(self):
        self.mail_send()

class MyWindow(QtGui.QMainWindow):
    server1 = QtCore.pyqtSignal(str)
    def __init__(self,parent=None):
        QtGui.QMainWindow.__init__(self, parent=parent)
        file_path = os.path.abspath("im-manager.ui")
        uic.loadUi(file_path, self)
        self.mail_btn.pressed.connect(self.run_mail_class)
        .
        .
        .
        self.myThread1 = MailSender()
        self.myThread1.newMessage.connect(self.statusText_updater)

     def run_mail_class(self):
        self.myThread1.start()

    def statusText_updater(self,text):
        time_print = time.strftime("%d/%m/%Y-%H:%M:%S")
        read1 = self.status.toPlainText()
        self.status.setText(text+" >>> "+time_print+" \n"+ read1+" ")

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    # app.exec_()
    sys.exit(app.exec_())

在您的情況下,我們必須創建一個函數來存儲MailSender類中的屬性,例如:

class MailSender(QtCore.QThread):
    newMessage = QtCore.pyqtSignal(str)
    def __init__(self, , parent=None):
        QtCore.QThread.__init__(self, parent)

    def setData(self, server, user, pass1):
        self.server = server
        self.user = user
        self.pass1 = pass1

然后在 run_mail_class 函數中,您必須在啟動線程之前調用該函數。

def run_mail_class(self):
    self.myThread1.setData(server,user, pass1)
    self.myThread1.start()

當您想訪問方法 mail_send 中的值時,您必須通過屬性來完成,例如:

conn = SMTP(str(self.server))
conn.login(str(self.user), str(self.pass1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM