Python 从线程在PyQt的lineEdit中引入文本

Python 从线程在PyQt的lineEdit中引入文本,python,multithreading,pyqt,Python,Multithreading,Pyqt,如何在lineEdit中从获取数据的线程引入文本而不关闭程序?重要的一行在类“fil”中,其中显示Principal.self.aplicio.actual\u lineEdit.setText(self.temp) 你可以用。您将向发出新文本的fil类添加一个信号: class fil(threading.Thread): update_line_edit = pyqtSignal(str) def __init__(self, temp, serie, line):

如何在lineEdit中从获取数据的线程引入文本而不关闭程序?重要的一行在类“fil”中,其中显示Principal.self.aplicio.actual\u lineEdit.setText(self.temp)

你可以用。您将向发出新文本的
fil
类添加一个信号:

class fil(threading.Thread):
    update_line_edit = pyqtSignal(str)
    def __init__(self, temp, serie, line):
        ...

    def run(self):
        try:
            while True:
                self.temp = self.serie.readline()
                if not self.temp:
                    update_line_edit.emit(self.temp)
        ...
然后,只需将该信号连接到
主体
类中的
插槽
函数:

class Principal(QtGui.QWidget):
    def __init__(self):
        ...

    def connectar(self):
        try:
            arduino = serial.Serial('/dev/ttyACM0', 9600)
            print "Connectat amb èxit"
            temperatura = fil(0, arduino, self.aplicacio.actual_lineEdit)
            temperatura.change_line_edit.connect(self.update_line_edit)
        ...

    def update_line_edit(self, text):
        self.aplicacio.actual_lineEdit.setText(text)

有几种方法可以正确做到这一点

第一种是使用QThread而不是python线程。然后,您可以使用Qt信号将消息从
fil
线程传递回Qt主线程,并将消息附加到那里的
QLineEdit
。另一种类似的方法是继续使用Python线程,但将消息放在Python
Queue.Queue()对象中。然后,此
队列
由辅助QThread读取,其唯一目的是从
队列
中读取消息,并向主线程发回信号

这两种方法的共同特点是,您只能从主线程访问QtGUI对象,并使用信号/插槽在线程之间进行通信。以下是我回答过的一些类似问题(您应该能够根据您的课程调整这些问题):

然而,自从回答了这些问题之后,我的同事和我创建了一个项目,帮助简化多线程Qt应用程序的编写。该项目被调用并处于启用状态,因此可以使用pip或easy_install进行安装(只需从命令行/终端窗口运行
pip install qtutils
easy_install qtutils


该库(除其他外)有一些函数
inmain
inmain\u later
,它们将在Qt主线程中同步或异步运行指定的方法(无论调用来自哪个线程)。关于如何使用这些方法的文档是。我已经修改了您的示例代码以使用我的inmain方法,并将代码放在这里:--显然,您需要安装qutils才能使其工作

OP使用的是Python线程,而不是Qt线程,所以你不能像你建议的那样使用信号。@three_Pinepples我没有在线程中使用信号。然而,他们的文档确实说:。不幸的是,目前还不清楚这是否意味着只有Qt线程或Python基线程。据我所知,信号只能附加到QoObject,因此这意味着只有QThreads。您的代码不能单独运行。使检查它正在做什么和您想要什么变得更加困难。你能不能把这个例子缩短一点,让它更完整?
class Principal(QtGui.QWidget):
    def __init__(self):
        ...

    def connectar(self):
        try:
            arduino = serial.Serial('/dev/ttyACM0', 9600)
            print "Connectat amb èxit"
            temperatura = fil(0, arduino, self.aplicacio.actual_lineEdit)
            temperatura.change_line_edit.connect(self.update_line_edit)
        ...

    def update_line_edit(self, text):
        self.aplicacio.actual_lineEdit.setText(text)