Search code examples
pythonpyqtqthread

pyqt QObject: Cannot create children for a parent that is in a different thread


QObject: Cannot create children for a parent that is in a different thread. (Parent is QTextDocument(0x9919018), parent's thread is QThread(0x97331e0), current thread is flooderthread(0x97b4c10) error means ? am sorry because am new to pyqt here is the code :

i know the code is finished yet but it should work i guess the problem is with myfun.log function...

    #! /usr/bin/python
# -*- coding: utf-8 -*-
import urllib, urllib2, itertools, threading, cookielib, Cookie, sys, time, hashlib, os
from PyQt4 import QtCore, QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s
gui=QtGui.QApplication.processEvents
texttoset=""
class fun():
    global texttoset
    def checkpassword(self):
        if ui.passwordcheck.isChecked()==True:
            return 1
        else :
            return 0
    def log(self, text):
        if text != False:
            firsttext=str(ui.console.toPlainText())
            secondtext=firsttext+text+"\n"
            ui.console.setText(secondtext)
            log=open("log.log", "a")
            log.write(text+"\n")
            log.close()
        else :
            firsttext=str(ui.console.toPlainText())
            secondtext=firsttext+texttoset+"\n"
            ui.console.setText(secondtext)
            log=open("log.log", "a")
            log.write(texttoset+"\n")
            log.close()
    def disable(self):
        MainWindow.setEnabled(False)
        pass
    def enable(self):
        MainWindow.setEnabled(True)
        pass
    def checkmethod(self):
        if ui.get.isChecked()==True:
            return 1
        elif ui.post.isChecked()==True:
            return 2
        else :
            return 0
    def main(self):
        connecter()
        gui()
        f1.start()
        gui()
        time.sleep(3)
        gui()
        f2.start()
        gui()
        time.sleep(3)
        gui()
        f3.start()
        gui()
        time.sleep(3)
        gui()
        f4.start()
        gui()
        time.sleep(3)
        gui()
        f5.start()
        gui()
        self.sleep(3)
        gui()
        f6.start()
        gui()
    def killer(self):
        f1.terminate()
        f2.terminate()
        f3.terminate()
        f4.terminate()
        f5.terminate()
        f6.terminate()
    def close(self):
        self.killer()
        os.abort()
        sys.exit()

myfun=fun()
def connecter():
    QtCore.QObject.connect(f1, QtCore.SIGNAL("log(bool)"), myfun.log)
    QtCore.QObject.connect(f1, QtCore.SIGNAL("enable()"), myfun.enable)
    QtCore.QObject.connect(f1, QtCore.SIGNAL("disable()"), myfun.disable)

    QtCore.QObject.connect(f2, QtCore.SIGNAL("log(bool)"), myfun.log)
    QtCore.QObject.connect(f2, QtCore.SIGNAL("enable()"), myfun.enable)
    QtCore.QObject.connect(f2, QtCore.SIGNAL("disable()"), myfun.disable)


    QtCore.QObject.connect(f3, QtCore.SIGNAL("log(bool)"), myfun.log)
    QtCore.QObject.connect(f3, QtCore.SIGNAL("enable()"), myfun.enable)
    QtCore.QObject.connect(f3, QtCore.SIGNAL("disable()"), myfun.disable)


    QtCore.QObject.connect(f4, QtCore.SIGNAL("log(bool)"), myfun.log)
    QtCore.QObject.connect(f4, QtCore.SIGNAL("enable()"), myfun.enable)
    QtCore.QObject.connect(f4, QtCore.SIGNAL("disable()"), myfun.disable)


    QtCore.QObject.connect(f5, QtCore.SIGNAL("log(bool)"), myfun.log)
    QtCore.QObject.connect(f5, QtCore.SIGNAL("enable()"), myfun.enable)
    QtCore.QObject.connect(f5, QtCore.SIGNAL("disable()"), myfun.disable)


    QtCore.QObject.connect(f6, QtCore.SIGNAL("log(bool)"), myfun.log)
    QtCore.QObject.connect(f6, QtCore.SIGNAL("enable()"), myfun.enable)
    QtCore.QObject.connect(f6, QtCore.SIGNAL("disable()"), myfun.disable)
x=0
num=0
class flooderthread(QtCore.QThread):
    global texttoset
    def __init__(self, x, num):
        QtCore.QThread.__init__(self)
        self.x=x
        self.num=num
    def log(self, text):
        texttolog=str(text)
        time.sleep(1)
        self.emit(QtCore.SIGNAL("log(bool)"), False)
        time.sleep(2)
    def enable(self):
        time.sleep(1)
        self.emit(QtCore.SIGNAL("enable()"))
    def disable(self):
        time.sleep(1)
        self.emit(QtCore.SIGNAL("disable()"))
    def run(self):
        connecter()
        self.log("\n\n--------------------------------------------------new session-------------------------------------\n\n")
        itered=False
        gui()
        self.disable()
        gui()
        self.log("setting params...")
        param={ui.dataname1.text():ui.datavalue1.text(),ui.dataname3.text():ui.datavalue3.text(),ui.dataname3.text():ui.datavalue3.text(), }
        self.log("checking password...")
        if myfun.checkpassword()==1:
            itered=True
            self.log("password is true")
        else :
            self.log("password is null ")
            self.log("itered operation")
        self.log("setting url")
        url=str(ui.url.text())
        if url[:4]!="http" and url[:3]!="ftp":
            self.log("url error exiting the whole function")
            self.log("please set a valide protocole!!")
            gui()
            self.enable()
            gui()
            return 1
            pass
        else :
            self.log("valid url")
            gui()
            self.log("url is "+url)
        self.log("setting proxy")
        proxy="http://"+ui.proxyuser.text()+":"+ui.proxypass.text()+"@"+ui.proxyhost.text()+":"+ui.proxyport.text()
        self.log("proxy is "+proxy)
        gui()
        self.log("preparing params...")
        urlparam=urllib.urlencode(param)
        gui()
        self.log("params are "+urlparam)
        self.log("setting up headers...")
        header={'User-Agent':str(ui.useragent.toPlainText())}
        self.log("headers are "+ str(header))
        self.log("setting up proxy handler..")
        proxyhandler=urllib2.ProxyHandler({"http":str(proxy)})
        self.log("checking method")
        if myfun.checkmethod()==1:
            self.log("method is get..")
            self.log("setting request..")
            finalurl=url+urlparam
            gui()
            self.log("final url is"+finalurl)
            req=urllib2.Request(finalurl, None, headers)
        elif myfun.checkmethod()==2:
            self.log("method is post...")
            self.log("setting request..")
            finalurl=url
            gui()
            self.log("final url is "+finalurl)
            req=urllib2.Request(finalurl, urlparam, header)
        else :
            self.log("error has been accourded")
            self.log("please select a method!!")
            gui()
            self.log("exiting the whole functions")
            gui()
            self.enable()
            return 1
            pass
        self.log("intilizing cookies..")
        c1=Cookie.SimpleCookie()
        c1[str(ui.cookiename1.text())]=str(ui.cookievalue1.text())
        c1[str(ui.cookiename1.text())]['path']='/'
        c1[str(ui.cookiename2.text())]=str(ui.cookievalue2.text())
        c1[str(ui.cookiename2.text())]['path']='/'
        c1[str(ui.cookiename3.text())]=str(ui.cookievalue3.text())
        c1[str(ui.cookiename3.text())]['domain']=url
        c1[str(ui.cookiename3.text())]['path']='/'
        c1[str(ui.cookiename4.text())]=str(ui.cookievalue4.text())
        c1[str(ui.cookiename4.text())]['domain']=url
        c1[str(ui.cookiename4.text())]['path']='/'
        self.log("cookies are.. :"+str(c1))
        cj=cookielib.CookieJar()
        cj.set_cookie(c1)
        opener = urllib2.build_opener(proxyhandler, urllib2.HTTPCookieProcessor(cj))
        self.log("insatlling opener")
        urllib2.install_opener(opener)
        self.log("setting the two operations....")
        if itered==Fasle:
            self.log("starting the flooding loop")
            gui()
            while true:
                try:
                    gui()
                    opener.open(req)
                except e:
                    self.log("error connecting : "+e.reason)
                    self.log("will continue....")
                    continue
                gui()

        elif itered==True:
            pass
f1=flooderthread(1, 1)
f2=flooderthread(2, 2)
f3=flooderthread(3, 3)
f4=flooderthread(4, 4)
f5=flooderthread(5, 5)
f6=flooderthread(6, 6)
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.setMinimumSize(QtCore.QSize(838, 500))
        MainWindow.setMaximumSize(QtCore.QSize(838, 500))
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "memo flooder", None, QtGui.QApplication.UnicodeUTF8))
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.console=QtGui.QTextEdit(self.centralwidget)
        self.console.setGeometry(10, 350, 800,130)
        self.console.setReadOnly(True)
        self.console.setObjectName("console")
        self.groupBox = QtGui.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(30, 50, 71, 80))
        self.groupBox.setTitle(QtGui.QApplication.translate("MainWindow", "method:", None, QtGui.QApplication.UnicodeUTF8))
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
        self.post = QtGui.QRadioButton(self.groupBox)
        self.post.setGeometry(QtCore.QRect(10, 20, 61, 22))
        self.post.setText(QtGui.QApplication.translate("MainWindow", "post", None, QtGui.QApplication.UnicodeUTF8))
        self.post.setChecked(True)
        self.post.setObjectName(_fromUtf8("post"))
        self.get = QtGui.QRadioButton(self.groupBox)
        self.get.setGeometry(QtCore.QRect(10, 50, 51, 22))
        self.get.setText(QtGui.QApplication.translate("MainWindow", "get", None, QtGui.QApplication.UnicodeUTF8))
        self.get.setObjectName(_fromUtf8("get"))
        self.url = QtGui.QLineEdit(self.centralwidget)
        self.url.setGeometry(QtCore.QRect(70, 20, 671, 27))
        self.url.setInputMethodHints(QtCore.Qt.ImhUrlCharactersOnly)
        self.url.setObjectName(_fromUtf8("url"))
        self.groupBox_2 = QtGui.QGroupBox(self.centralwidget)
        self.groupBox_2.setGeometry(QtCore.QRect(110, 50, 371, 111))
        self.groupBox_2.setTitle(QtGui.QApplication.translate("MainWindow", "data:", None, QtGui.QApplication.UnicodeUTF8))
        self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
        self.dataname1 = QtGui.QLineEdit(self.groupBox_2)
        self.dataname1.setGeometry(QtCore.QRect(20, 30, 101, 27))
        self.dataname1.setObjectName(_fromUtf8("dataname1"))
        self.label = QtGui.QLabel(self.groupBox_2)
        self.label.setGeometry(QtCore.QRect(40, 10, 67, 17))
        self.label.setText(QtGui.QApplication.translate("MainWindow", "name:", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setObjectName(_fromUtf8("label"))
        self.dataname2 = QtGui.QLineEdit(self.groupBox_2)
        self.dataname2.setGeometry(QtCore.QRect(130, 30, 113, 27))
        self.dataname2.setObjectName(_fromUtf8("dataname2"))
        self.dataname3 = QtGui.QLineEdit(self.groupBox_2)
        self.dataname3.setGeometry(QtCore.QRect(250, 30, 113, 27))
        self.dataname3.setObjectName(_fromUtf8("dataname3"))
        self.label_2 = QtGui.QLabel(self.groupBox_2)
        self.label_2.setGeometry(QtCore.QRect(40, 60, 67, 17))
        self.label_2.setText(QtGui.QApplication.translate("MainWindow", "value:", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.datavalue1 = QtGui.QLineEdit(self.groupBox_2)
        self.datavalue1.setGeometry(QtCore.QRect(20, 80, 101, 27))
        self.datavalue1.setObjectName(_fromUtf8("datavalue1"))
        self.datavalue2 = QtGui.QLineEdit(self.groupBox_2)
        self.datavalue2.setGeometry(QtCore.QRect(130, 80, 113, 27))
        self.datavalue2.setObjectName(_fromUtf8("datavalue2"))
        self.datavalue3 = QtGui.QLineEdit(self.groupBox_2)
        self.datavalue3.setGeometry(QtCore.QRect(250, 80, 113, 27))
        self.datavalue3.setObjectName(_fromUtf8("datavalue3"))
        self.groupBox_4 = QtGui.QGroupBox(self.centralwidget)
        self.groupBox_4.setGeometry(QtCore.QRect(670, 50, 151, 111))
        self.groupBox_4.setTitle(QtGui.QApplication.translate("MainWindow", "password:", None, QtGui.QApplication.UnicodeUTF8))
        self.groupBox_4.setObjectName(_fromUtf8("groupBox_4"))
        self.passname = QtGui.QLineEdit(self.groupBox_4)
        self.passname.setGeometry(QtCore.QRect(10, 30, 113, 27))
        self.passname.setObjectName(_fromUtf8("passname"))
        self.passvalue = QtGui.QLineEdit(self.groupBox_4)
        self.passvalue.setGeometry(QtCore.QRect(10, 80, 113, 27))
        self.passvalue.setObjectName(_fromUtf8("passvalue"))
        self.passwordcheck = QtGui.QCheckBox(self.centralwidget)
        self.passwordcheck.setGeometry(QtCore.QRect(670, 180, 97, 22))
        self.passwordcheck.setText(QtGui.QApplication.translate("MainWindow", "password", None, QtGui.QApplication.UnicodeUTF8))
        self.passwordcheck.setChecked(True)
        self.passwordcheck.setObjectName(_fromUtf8("passwordcheck"))
        self.groupBox_5 = QtGui.QGroupBox(self.centralwidget)
        self.groupBox_5.setGeometry(QtCore.QRect(29, 169, 441, 81))
        self.groupBox_5.setTitle(QtGui.QApplication.translate("MainWindow", "proxy:", None, QtGui.QApplication.UnicodeUTF8))
        self.groupBox_5.setObjectName(_fromUtf8("groupBox_5"))
        self.proxyhost = QtGui.QLineEdit(self.groupBox_5)
        self.proxyhost.setGeometry(QtCore.QRect(20, 30, 113, 27))
        self.proxyhost.setObjectName(_fromUtf8("proxyhost"))
        self.proxyport = QtGui.QLineEdit(self.groupBox_5)
        self.proxyport.setGeometry(QtCore.QRect(140, 30, 51, 27))
        self.proxyport.setInputMethodHints(QtCore.Qt.ImhDigitsOnly|QtCore.Qt.ImhPreferNumbers)
        self.proxyport.setObjectName(_fromUtf8("proxyport"))
        self.proxyuser = QtGui.QLineEdit(self.groupBox_5)
        self.proxyuser.setGeometry(QtCore.QRect(200, 30, 113, 27))
        self.proxyuser.setObjectName(_fromUtf8("proxyuser"))
        self.proxypass = QtGui.QLineEdit(self.groupBox_5)
        self.proxypass.setGeometry(QtCore.QRect(320, 30, 113, 27))
        self.proxypass.setObjectName(_fromUtf8("proxypass"))
        self.label_4 = QtGui.QLabel(self.groupBox_5)
        self.label_4.setGeometry(QtCore.QRect(100, 10, 67, 17))
        self.label_4.setText(QtGui.QApplication.translate("MainWindow", "host", None, QtGui.QApplication.UnicodeUTF8))
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.label_5 = QtGui.QLabel(self.groupBox_5)
        self.label_5.setGeometry(QtCore.QRect(150, 10, 67, 17))
        self.label_5.setText(QtGui.QApplication.translate("MainWindow", "port", None, QtGui.QApplication.UnicodeUTF8))
        self.label_5.setObjectName(_fromUtf8("label_5"))
        self.label_6 = QtGui.QLabel(self.groupBox_5)
        self.label_6.setGeometry(QtCore.QRect(200, 10, 67, 17))
        self.label_6.setText(QtGui.QApplication.translate("MainWindow", "username", None, QtGui.QApplication.UnicodeUTF8))
        self.label_6.setObjectName(_fromUtf8("label_6"))
        self.label_7 = QtGui.QLabel(self.groupBox_5)
        self.label_7.setGeometry(QtCore.QRect(320, 10, 67, 17))
        self.label_7.setText(QtGui.QApplication.translate("MainWindow", "password", None, QtGui.QApplication.UnicodeUTF8))
        self.label_7.setObjectName(_fromUtf8("label_7"))
        self.groupBox_6 = QtGui.QGroupBox(self.centralwidget)
        self.groupBox_6.setGeometry(QtCore.QRect(30, 260, 531, 91))
        self.groupBox_6.setTitle(QtGui.QApplication.translate("MainWindow", "cookies:", None, QtGui.QApplication.UnicodeUTF8))
        self.groupBox_6.setObjectName(_fromUtf8("groupBox_6"))
        self.cookiename1 = QtGui.QLineEdit(self.groupBox_6)
        self.cookiename1.setGeometry(QtCore.QRect(10, 20, 113, 27))
        self.cookiename1.setObjectName(_fromUtf8("cookiename1"))
        self.cookiename2 = QtGui.QLineEdit(self.groupBox_6)
        self.cookiename2.setGeometry(QtCore.QRect(140, 20, 113, 27))
        self.cookiename2.setObjectName(_fromUtf8("cookename2"))
        self.cookiename3 = QtGui.QLineEdit(self.groupBox_6)
        self.cookiename3.setGeometry(QtCore.QRect(270, 20, 113, 27))
        self.cookiename3.setObjectName(_fromUtf8("cookiename3"))
        self.cookiename4 = QtGui.QLineEdit(self.groupBox_6)
        self.cookiename4.setGeometry(QtCore.QRect(390, 20, 113, 27))
        self.cookiename4.setObjectName(_fromUtf8("cookiename4"))
        self.cookievalue1 = QtGui.QLineEdit(self.groupBox_6)
        self.cookievalue1.setGeometry(QtCore.QRect(10, 50, 113, 27))
        self.cookievalue1.setObjectName(_fromUtf8("cookievalue1"))
        self.cookievalue2 = QtGui.QLineEdit(self.groupBox_6)
        self.cookievalue2.setGeometry(QtCore.QRect(140, 50, 113, 27))
        self.cookievalue2.setObjectName(_fromUtf8("cookievalue2"))
        self.cookievalue3 = QtGui.QLineEdit(self.groupBox_6)
        self.cookievalue3.setGeometry(QtCore.QRect(270, 50, 113, 27))
        self.cookievalue3.setObjectName(_fromUtf8("cookievalue3"))
        self.cookievalue4 = QtGui.QLineEdit(self.groupBox_6)
        self.cookievalue4.setGeometry(QtCore.QRect(390, 50, 113, 27))
        self.cookievalue4.setObjectName(_fromUtf8("cookievalue4"))
        self.groupBox_7 = QtGui.QGroupBox(self.centralwidget)
        self.groupBox_7.setGeometry(QtCore.QRect(570, 260, 251, 80))
        self.groupBox_7.setTitle(QtGui.QApplication.translate("MainWindow", "useragents:", None, QtGui.QApplication.UnicodeUTF8))
        self.groupBox_7.setObjectName(_fromUtf8("groupBox_7"))
        self.useragent = QtGui.QTextEdit(self.groupBox_7)
        self.useragent.setGeometry(QtCore.QRect(10, 20, 211, 51))
        self.useragent.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.useragent.setObjectName(_fromUtf8("useragent"))
        self.start = QtGui.QPushButton(self.centralwidget)
        self.start.setGeometry(QtCore.QRect(750, 20, 71, 27))
        self.start.setText(QtGui.QApplication.translate("MainWindow", "start", None, QtGui.QApplication.UnicodeUTF8))
        self.start.setObjectName(_fromUtf8("start"))
        self.label_3 = QtGui.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(30, 20, 67, 17))
        self.label_3.setText(QtGui.QApplication.translate("MainWindow", "url :", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setObjectName(_fromUtf8("label_3"))
        MainWindow.setCentralWidget(self.centralwidget)
        QtCore.QObject.connect(self.start, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), myfun.main)
        QtCore.QObject.connect(self.passwordcheck, QtCore.SIGNAL(_fromUtf8("clicked(bool)")), self.groupBox_4.setEnabled)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


def __del__():
    myfun.killer()
    os.abort()
    sys.exit()

app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
myfun.log("\n\n--------------------------------------------------new session-------------------------------------\n\n")
MainWindow.show()
sys.exit(app.exec_())

Solution

  • I have almost no idea whats going on in your code, in terms of its intent, but here is the offending line of code causing your crash:

    class flooderthread(QtCore.QThread):
        ...
        def run(self):
            connecter() # this is the culprit
    

    In your fun.main(), you call the connecter() once already to set up all your signal/slot connections. This call is occurring in your main thread. But then you have each thread also calling that method, which is trying to make duplicate connections to objects across threads. The actual crash may be caused much deeper than this function, because its the result of signal firing, but I find it just too difficult to hop around the code to get any deeper. Most likely you are having the thread directly modify GUI elements when it shouldn't.

    Once you have that fixed, you have one other typo that will make it crash:

    def main(self):
        connecter()
        ...
        time.sleep(3)
        gui()
        f5.start()
        gui()
        self.sleep(3)  # should be time.sleep(3)
        gui()
        ...
    

    Aside from this, I just want to point out that this script is extremely hard to follow. You are making use of globals everywhere, so its hard to know where certain variables and function calls were defined. You have to scroll around a bunch, chasing them down. You may want to stop and reorganize this before it continues to snowball.
    I would highly suggest picking up a book like this: http://www.qtrac.eu/pyqtbook.html
    What you should focus on is organizing proper classes. Your current class structures need a lot of review, so you may want to even pick up a good python book to first learn how to write classes. I realize you are just learning, which is why I am hoping this advise will help steer you in the right direction.