简体   繁体   中英

Why PyQt4 slot received one signal many time

I use pyuic4 to create GUI and create a thread that do hard work, when that thread done, it append the result to textbrowser. Problem is: When I enter some text into "HOST or URL", clicked to button "Do check", it prints out "this is text" once. But when I change text from URL, press that button again, it print twice, and they increase each time later. The log said that signal only emit once but slot function is called many time. I dont know what i'm missing. Can anyone suggest a solution to this? Thank you for any help you can provide

this is my 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_())

and the file converted by 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))

Solved this, just move

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

to inside method

def setupUi(self, *args):

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM