如何从属于 MainWindow class 的 QlineEdit 中读取文本,并使用 python 和 pyqt 将其用于 Qthread class?
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 的新手,我在开发应用程序时遇到了问题。我正在构建一个 QThread
class,它通过邮件发送一个 .csv
文件,昨天一位同事向我展示了如何向 Main [= 中的 QtextBrowser 发送 str
信号34=]。现在我需要读取 3 QlineEdit
,其中包含服务器地址、用户名和密码。但我似乎不太了解如何从中读取 str
并将其发送到我需要的地方。
这 3 个 QlineEdit
被称为:server_line
、user_line
、pass_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 中的函数,例如:
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))
我是 python 和 pyqt 的新手,我在开发应用程序时遇到了问题。我正在构建一个 QThread
class,它通过邮件发送一个 .csv
文件,昨天一位同事向我展示了如何向 Main [= 中的 QtextBrowser 发送 str
信号34=]。现在我需要读取 3 QlineEdit
,其中包含服务器地址、用户名和密码。但我似乎不太了解如何从中读取 str
并将其发送到我需要的地方。
这 3 个 QlineEdit
被称为:server_line
、user_line
、pass_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 中的函数,例如:
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))