PyQt 中使用线程获取数据

42 阅读1分钟

在一个使用 PyQt 的应用程序中,用户希望在调用 Continusread 方法时获取用户界面中 Count_total_value 的值,但总是显示默认值 "azerty",而希望显示 "toto"。以下是我的代码示例:

huake_00257_.jpg

#!/usr/bin/env python3
from PyQt4 import QtCore, QtGui

import sys
import os
import subprocess
import time
import threading
from ctypes import *
import ctypes
#import Converted Python UI File
from test_error_rx import Ui_MainWindow
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;

class MyThread(QtCore.QThread):
    Count_total_valuechanged = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(MyThread, self).__init__(parent=parent)
        self.Count_total_value = 'Azerty'

    def run(self):
    ##do things to calculate Count_total_value
        Count_total_value='toto'
        self.Count_total_valuechanged.emit((self.Count_total_value))
        time.sleep(0.1)


class Main( QtGui.QMainWindow,QtGui.QWidget):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Connect the Buttons
        QtCore.QObject.connect(self.ui.Continusread,QtCore.SIGNAL("clicked()"),self.Continusread)

        self.__thread = MyThread(self)
        self.__thread.Count_total_valuechanged.connect(self.ui.Count_total.setText)

    def Continusread(self):
       self.__thread.start()

    def main():
        app = QtGui.QApplication(sys.argv)
        window = Main()
        window.show()
        sys.exit(app.exec_())

    if __name__ == "__main__":
        main()

2、解决方案

问题在于 run() 方法中设置 Count_total_value 的方式错误。正确的做法是将 Count_total_value='toto' 替换为 self.Count_total_value='toto'。以下是修改后的代码示例:

#!/usr/bin/env python3
from PyQt4 import QtCore, QtGui

import sys
import os
import subprocess
import time
import threading
from ctypes import *
import ctypes
#import Converted Python UI File
from test_error_rx import Ui_MainWindow

class MyThread(QtCore.QThread):
    Count_total_valuechanged = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(MyThread, self).__init__(parent=parent)
        self.Count_total_value = 'Azerty'

    def run(self):
    ##do things to calculate Count_total_value
        self.Count_total_value='toto'
        self.Count_total_valuechanged.emit((self.Count_total_value))
        time.sleep(0.1)


class Main( QtGui.QMainWindow,QtGui.QWidget):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Connect the Buttons
        QtCore.QObject.connect(self.ui.Continusread,QtCore.SIGNAL("clicked()"),self.Continusread)

        self.__thread = MyThread(self)
        self.__thread.Count_total_valuechanged.connect(self.ui.Count_total.setText)

    def Continusread(self):
       self.__thread.start()

    def main():
        app = QtGui.QApplication(sys.argv)
        window = Main()
        window.show()
        sys.exit(app.exec_())

    if __name__ == "__main__":
        main()

修改后,调用 Continusread 方法时,Count_total_value 的值将正确地更新为 "toto" 并显示在用户界面中。