【问题标题】:changing textlabel and qthread pyqt更改 textlabel 和 qthread pyqt
【发布时间】:2014-09-14 02:15:09
【问题描述】:

我用 qt 设计器编写了一些 GUI。这个脚本是用 qt 设计器生成的,我写了 class mythread:

from PyQt4 import QtCore, QtGui
import time
import socket
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class mythread(QtCore.QThread):

    def __init__(self):
        QtCore.QThread.__init__(self)

    def run(self):
        while True:
            TCP_IP = 
            TCP_PORT = 
            s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((TCP_IP, TCP_PORT))
            s.send('GLST\r\n')
            glst = s.recv(1024)
            if glst:
                s.send('GLSC\r\n')
                glsc = s.recv(1024)
                print glst,glsc
            s.close()
            time.sleep(0.1)


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 40, 221, 31))
        self.label.setStyleSheet(_fromUtf8("background-color:rgb(48, 48, 48)"))
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(290, 40, 221, 31))
        self.label_2.setStyleSheet(_fromUtf8("background-color:rgb(48, 48, 48)"))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.label, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.mythread)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("MainWindow", "<html><head/><body><p><span style=\" font-weight:600; color:#ffffff;\">co:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate("MainWindow", "<html><head/><body><p><span style=\" font-weight:600; color:#ffffff;\">co:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))




if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
sys.exit(app.exec_())

在 mythread 类中,我有一个函数 run,它与服务器建立连接,然后在它们上发送两个命令。此函数接收一些数据(glst,glsc),现在我想在 GUI 的 textlabel 中使用 while 循环动态查看这些数据(glst,glsc)。

但我不知道如何将线程连接到 gui-textlabel。

感谢您的任何想法。强尼

这里是评论补充的脚本

from PyQt4 import QtCore, QtGui
import time
import socket

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

 class mythread(QtCore.QThread):
     def __init__(self):
         QtCore.QThread.__init__(self)

     def run(self):
        while True:
             TCP_IP = 
             TCP_PORT = 
             s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             s.connect((TCP_IP, TCP_PORT))
             s.send('GLSC\r\n')
             glsc = s.recv(1024)
             print glsc[:9]
             self.setLog(glsc[:9])
             if glsc:
                 s.send('GLST\r\n')
                 glst = s.recv(1024)
                 print glst
                 self.setLog(glst)
             s.close()
             time.sleep(0.1)


     def setLog (self, text):
         self.emit(SIGNAL("log(QString)"), QtCore.QString(text))


 class Ui_MainWindow(object):

     def setupUi(self,MainWindow):
         self.mythread = mythread()
         MainWindow.setObjectName(_fromUtf8("MainWindow"))
         MainWindow.resize(800, 600)
         self.centralwidget = QtGui.QWidget(MainWindow)
         self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
         self.label = QtGui.QLabel(self.centralwidget)
         self.label.setGeometry(QtCore.QRect(40, 40, 221, 31))
         self.label.setStyleSheet(_fromUtf8("background-color:rgb(48, 48, 48)"))
         self.label.setObjectName(_fromUtf8("label"))
         self.label_2 = QtGui.QLabel(self.centralwidget)
         self.label_2.setGeometry(QtCore.QRect(290, 40, 221, 31))
         self.label_2.setStyleSheet(_fromUtf8("background-color:rgb(48, 48, 48)"))
         self.label_2.setObjectName(_fromUtf8("label_2"))
         MainWindow.setCentralWidget(self.centralwidget)
         self.menubar = QtGui.QMenuBar(MainWindow)
         self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
         self.menubar.setObjectName(_fromUtf8("menubar"))
         MainWindow.setMenuBar(self.menubar)
         self.statusbar = QtGui.QStatusBar(MainWindow)
         self.statusbar.setObjectName(_fromUtf8("statusbar"))

         MainWindow.setStatusBar(self.statusbar)
         self.retranslateUi(MainWindow)
         QtCore.QObject.connect(self.mythread, QtCore.SIGNAL("log(QString)"), self.label.setText)
         QtCore.QMetaObject.connectSlotsByName(MainWindow)

     def retranslateUi(self, MainWindow):
         MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
         self.label.setText(QtGui.QApplication.translate("MainWindow", "<html><head/><body><p><span style=\" font-weight:600; color:#ffffff;\"></span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
         self.label_2.setText(QtGui.QApplication.translate("MainWindow", "<html><head/><body><p><span style=\" font-weight:600; color:#ffffff;\"></span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))




 if __name__ == "__main__":
     import sys
     app = QtGui.QApplication(sys.argv)
     MainWindow = QtGui.QMainWindow()
     ui = Ui_MainWindow()
     ui.setupUi(MainWindow)
     MainWindow.show()
     sys.exit(app.exec_())

【问题讨论】:

    标签: pyqt qt-designer


    【解决方案1】:

    最后编辑时间:12 / 8 / 2014 9 : 01 重构代码

    我建议你通过继承类QtGui.QMainWindow来实现,请看我的重构代码;

    from PyQt4 import QtCore, QtGui
    import sys
    import time
    import socket
    
    class QMyThread (QtCore.QThread):
        def __init__(self, parent = None):
            super(QtCore.QThread, self).__init__(parent)
    
        def run(self):
            while True:
                TCP_IP = '127.0.0.1'
                TCP_PORT = 23
                mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                mySocket.connect((TCP_IP, TCP_PORT))
                mySocket.send('GLSC\r\n')
                glsc = mySocket.recv(1024)
                print glsc[:9]
                self.setLog1(glsc[:9])
                if glsc:
                    mySocket.send('GLST\r\n')
                    glst = mySocket.recv(1024)
                    print glst
                    self.setLog2(glst)
                mySocket.close()
                time.sleep(0.1)
    
        def setLog1 (self, text):
            self.emit(QtCore.SIGNAL('log1(QString)'), QtCore.QString(text))
    
        def setLog2 (self, text):
            self.emit(QtCore.SIGNAL('log2(QString)'), QtCore.QString(text))
    
    class QMyMainWindow (QtGui.QMainWindow):
        def __init__(self, parent = None):
            super(QtGui.QMainWindow, self).__init__(parent)
            self.myInit()
    
        def myInit (self):
            self.mythread = QMyThread(self)
            self.setObjectName('MainWindow')
            self.resize(800, 600)
            self.centralwidget = QtGui.QWidget(self)
            self.centralwidget.setObjectName('centralwidget')
            self.label = QtGui.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(40, 40, 221, 31))
            self.label.setStyleSheet('color:rgb(255, 255, 255); background-color:rgb(48, 48, 48);')
            self.label.setObjectName('label')
            self.label_2 = QtGui.QLabel(self.centralwidget)
            self.label_2.setGeometry(QtCore.QRect(290, 40, 221, 31))
            self.label_2.setStyleSheet('color:rgb(255, 255, 255); background-color:rgb(48, 48, 48);')
            self.label_2.setObjectName('label_2')
            self.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(self)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName('menubar')
            self.setMenuBar(self.menubar)
            self.statusbar = QtGui.QStatusBar(self)
            self.statusbar.setObjectName('statusbar')
            self.setStatusBar(self.statusbar)
    
            self.setWindowTitle('Main Windows')
    
            self.connect(self.mythread, QtCore.SIGNAL('log1(QString)'), self.label.setText)
            self.connect(self.mythread, QtCore.SIGNAL('log2(QString)'), self.label_2.setText)
            self.mythread.start()
    
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        MainWindow = QMyMainWindow()
        MainWindow.show()
        sys.exit(app.exec_())
    

    上次编辑时间:2014 年 12 月 8 日 7:34 修复错误“找不到连接”

    我将您的主小部件与 QThread 的想法相同,将其与 SIGNAL 连接回主小部件;

    主小部件

    .
    .
    def setupUi(self, MainWindow):
        .
        .
        self.mythread = mythread()
        .
        .
        QtCore.QObject.connect(self.mythread, QtCore.SIGNAL("log(QString)"), self.label.setText)
        .
        .
    

    QThread

    class mythread(QtCore.QThread):
    
        def __init__(self):
            QtCore.QThread.__init__(self)
    
        def run(self):
            while True:
                TCP_IP = 
                TCP_PORT = 
                s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.connect((TCP_IP, TCP_PORT))
                s.send('GLST\r\n')
                glst = s.recv(1024)
                self.setLog(glst)
                if glst:
                    s.send('GLSC\r\n')
                    glsc = s.recv(1024)
                    self.setLog(glsc)
                    print glst,glsc
                s.close()
                time.sleep(0.1)
    
        def setLog (self, text):
            self.emit(QtCore.SIGNAL("log(QString)"), QtCore.QString(text))
    

    问候,

    【讨论】:

    • 非常感谢。但是当我将你的脚本行添加到我的整个脚本中时,我得到了 AttributeError:'Ui_MainWindow' 对象没有属性 'connect'。我不明白它是什么。
    • 对不起,错误是我认为你继承了 QWidget 或 QMainWindows,请看我最后编辑的答案。
    • 我用你的脚本行添加到主帖子脚本中......但我再次出现错误 AttributeError: 'Ui_MainWindow' object has no attribute 'mythread'
    • 请在“Ui_MainWindow”中定义“self.mythread”; self.mythread = mythread()
    • 非常感谢我现在明白了...脚本正在运行...谢谢
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2014-03-25
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多