为什么PyQt4插槽多次接收一个信号

时间:2012-07-16 07:15:53

标签: python multithreading pyqt4

我使用pyuic4来创建GUI并创建一个执行艰苦工作的线程,当该线程完成时,它会将结果附加到textbrowser。 问题是: 当我在" HOST或URL"中输入一些文本时,单击按钮"执行检查",它打印出"这是文本"一旦。但是当我从URL更改文本时,再次按下该按钮,它会打印两次,并且每次都会增加。日志表示信号只发出一次但是槽函数被多次调用。我不知道我错过了什么。有谁能建议解决这个问题? 感谢您提供的任何帮助

这是我的main.py

import logging
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QMessageBox
from form1 import *

logging.basicConfig(filename="netchecker.log", filemode='w',\
        format='%(asctime)s %(levelname)s %(message)s',
        level=logging.DEBUG)

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

class PingThread(QtCore.QThread):
    def run(self):
        logging.debug("*****Done pingThread")
        all_res = "this is text"
        self.emit(QtCore.SIGNAL("Data"), all_res)

class MyApp(Ui_MainWindow):
    def __init__(self, app):
        logging.info("Init MyAPP")
        self.app = app
        self.pingThread = PingThread()

    def setupUi(self, *args):
        super(MyApp, self).setupUi(*args)
        logging.info("setupUi")
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.doCheck)

    def append_to_text_browser(self, newtext):
        """This method is callback for some thread run separated
        from main thread"""
        logging.debug("Inside append_to_text_browser")
        self.textBrowser.append(newtext)
        self.app.processEvents()

    def onNewUrl(self):
        font = QtGui.QFont()
        self.pushButton.setFont(font)
        del font
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Do new check", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setEnabled(True)
        self.app.processEvents()

    def doCheck(self):
        logging.info("doCheck beginning")
        self.textBrowser.clear()
        QtCore.QObject.connect(self.pingThread, \
                QtCore.SIGNAL("Data"), \
                self.append_to_text_browser)
        logging.info("Called pingThread")
        self.pingThread.start()

if __name__ == "__main__":

    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    MainWindow.setWindowIcon(QtGui.QIcon('zChecker.png'))
    ui = MyApp(app)

    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

和pyuic4 form1.py转换的文件:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test.ui'
#
# Created: Thu Jul 12 17:21:45 2012
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

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

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.setEnabled(True)
        MainWindow.resize(679, 713)
        font = QtGui.QFont()
        font.setKerning(True)
        MainWindow.setFont(font)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.lineEdit = QtGui.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(100, 10, 561, 27))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 81, 31))
        self.label.setObjectName(_fromUtf8("label"))
        self.checkBox_1 = QtGui.QCheckBox(self.centralwidget)
        self.checkBox_1.setGeometry(QtCore.QRect(70, 50, 121, 22))
        self.checkBox_1.setChecked(True)
        self.checkBox_1.setObjectName(_fromUtf8("checkBox_1"))
        self.checkBox_2 = QtGui.QCheckBox(self.centralwidget)
        self.checkBox_2.setGeometry(QtCore.QRect(70, 80, 161, 22))
        self.checkBox_2.setChecked(True)
        self.checkBox_2.setObjectName(_fromUtf8("checkBox_2"))
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setEnabled(True)
        self.pushButton.setGeometry(QtCore.QRect(510, 60, 98, 27))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        font.setKerning(True)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.textBrowser = QtGui.QTextBrowser(self.centralwidget)
        self.textBrowser.setGeometry(QtCore.QRect(20, 110, 641, 521))
        self.textBrowser.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.textBrowser.setObjectName(_fromUtf8("textBrowser"))
        self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
        self.pushButton_2.setEnabled(False)
        self.pushButton_2.setGeometry(QtCore.QRect(310, 630, 111, 31))
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.checkbox_vital = QtGui.QCheckBox(self.centralwidget)
        self.checkbox_vital.setEnabled(True)
        self.checkbox_vital.setGeometry(QtCore.QRect(260, 50, 181, 22))
        self.checkbox_vital.setToolTip(_fromUtf8(""))
        self.checkbox_vital.setStatusTip(_fromUtf8(""))
        self.checkbox_vital.setObjectName(_fromUtf8("checkbox_vital"))
        self.checkbox_full = QtGui.QCheckBox(self.centralwidget)
        self.checkbox_full.setEnabled(False)
        self.checkbox_full.setGeometry(QtCore.QRect(260, 80, 141, 22))
        self.checkbox_full.setToolTip(_fromUtf8(""))
        self.checkbox_full.setObjectName(_fromUtf8("checkbox_full"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 679, 27))
        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.lineEdit, QtCore.SIGNAL(_fromUtf8("textEdited(QString)")), self.pushButton.showMenu)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Network and website\'s health Checker - by MinhCD", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("MainWindow", "Host or URL", None, QtGui.QApplication.UnicodeUTF8))
        self.checkBox_1.setText(QtGui.QApplication.translate("MainWindow", "Ping all parts", None, QtGui.QApplication.UnicodeUTF8))
        self.checkBox_2.setText(QtGui.QApplication.translate("MainWindow", "TraceRoute all parts", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "Do check", None, QtGui.QApplication.UnicodeUTF8))
        self.textBrowser.setHtml(QtGui.QApplication.translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Ubuntu\'; font-size:11pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n"
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-style:italic;\">Check results will be displayed here:</span></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton_2.setText(QtGui.QApplication.translate("MainWindow", "Send report", None, QtGui.QApplication.UnicodeUTF8))
        self.checkbox_vital.setText(QtGui.QApplication.translate("MainWindow", "Load vital components", None, QtGui.QApplication.UnicodeUTF8))
        self.checkbox_full.setText(QtGui.QApplication.translate("MainWindow", "Load full site", None, QtGui.QApplication.UnicodeUTF8))

1 个答案:

答案 0 :(得分:0)

解决了这个问题,只需移动

QtCore.QObject.connect(self.pingThread, \
                QtCore.SIGNAL("Data"), \
                self.append_to_text_browser)

到内部方法

def setupUi(self, *args):