2012-07-16 19 views
0

我使用pyuic4來創建GUI並創建一個線程,該線程完成工作,當線程完成時,它將結果附加到textbrowser。 問題是: 當我在「HOST或URL」中輸入一些文本時,點擊按鈕「執行檢查」,它打印出「這是文本」一次。但是當我從URL更改文本時,再次按該按鈕,它會打印兩次,並且每次都會增加。日誌說,信號只發射一次,但插槽功能被稱爲很多時間。我不知道我錯過了什麼。任何人都可以提出解決方案嗎? 感謝您的幫助,您可以提供爲什麼PyQt4插槽在很多時候收到一個信號

這是我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)) 

回答

0

解決了這個,只是移動

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

內部方法

def setupUi(self, *args):