Из за чего краш программы на pyqt5 при выводе логов

При включении класса QTextEditLogger(logging.Handler) происходит краш через секунду - две, без вывода ошибок в консоль. Где искать проблему?

вот код программы:

from instapy import InstaPy
import sys
from ui import *
from tui import *
from instapy.plugins import InstaPyTelegramBot
import sqlite3
import logging
import threading
from PyQt5 import QtCore, QtGui, QtWidgets
 

class InstaBot(QtCore.QThread):
    def __init__(self,username,password,browser,amount,media_per,follow,like,comment_count,comment,user,user_count,following,liking,
                 commenting, parent = None):
        super(InstaBot, self).__init__(parent)
        self.username = username
        self.password = password
        self.browser = browser
        self.amount = int(amount)
        self.media_per = int(media_per)
        self.follow = int(follow)
        self.like = int(like)
        self.comment = comment
        self.comment_count = int(comment_count)
        self.user = str(user)
        self.user_count = int(user_count)
        self.following = following
        self.liking = liking
        self.commenting = commenting
 
    def run(self):
        conn = sqlite3.connect("session.db")
        cursor = conn.cursor()
        for row in cursor.execute(f"SELECT token FROM telegram where id=1"):
            token = row[0]
        for row in cursor.execute(f"SELECT nick FROM telegram where id=1"):
            nick = row[0]
 
        session = InstaPy(username=f"{self.username}", password=f"{self.password}", headless_browser=self.browser)
        telegram = InstaPyTelegramBot(token=f'{token}',
                                      telegram_username=f'{nick}',
                                      instapy_session=session)
        session.login()
        session.set_user_interact(amount=self.amount, randomize=True, percentage=self.media_per, media='Photo')
        session.set_do_follow(enabled=self.following, percentage=self.follow)
        session.set_do_like(enabled=self.liking, percentage=self.like)
        session.set_comments([self.comment])
        session.set_do_comment(enabled=self.commenting, percentage=self.comment_count)
        session.interact_user_followers([f"{self.user}"], amount=self.user_count, randomize=True)
        session.end()

 
class QTextEditLogger(logging.Handler):
    def __init__(self, parent):
        super().__init__(QtCore.Qt.Window)
        self.widget = QtWidgets.QPlainTextEdit(parent)
        self.widget.setGeometry(QtCore.QRect(20, 670, 491, 101))
        self.widget.setStyleSheet("border-radius: 10;\n"
"background-color: rgb(194, 194, 194);\n"
"color: rgb(0, 0, 0);")
        self.widget.setReadOnly(True)
 
    def emit(self, record):
        th = threading.Thread()
        th.daemon = True
        th.start()
        msg = self.format(record)
        self.widget.appendPlainText(msg)

 
class MyWin(QtWidgets.QMainWindow):
    """docstring for MyWin"""
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.startButton.clicked.connect(self.liking_follow)
        self.ui.stopButton.clicked.connect(self.stop)
        self.ui.telegramButton.clicked.connect((self.telegram))
 
        logTextBox = QTextEditLogger(self)
        # You can format what is printed to text box
        logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        logging.getLogger().addHandler(logTextBox)
        # You can control the logging level
        logging.getLogger().setLevel(logging.INFO)
 
        # Подключение базы данных
        # обновление информации полей
        conn = sqlite3.connect("session.db")
        cursor = conn.cursor()
        cursor.execute(f"SELECT id FROM instabot where id=1")
        for row in cursor.execute(f"SELECT user FROM instabot where id=1"):
            user_session = row[0]
        if user_session == (''):
            pass
        else:
            self.ui.loginEdit.setText(user_session)
 
        for row in cursor.execute(f"SELECT password FROM instabot where id=1"):
            password = row[0]
        if password == (''):
            pass
        else:
            self.ui.passEdit.setText(password)
 
        for row in cursor.execute(f"SELECT show FROM instabot where id=1"):
            browser = row[0]
            if browser == "True":
                self.ui.checkBox.setChecked(True)
            else:
                self.ui.checkBox.setChecked(False)
 
        for row in cursor.execute(f"SELECT remind FROM instabot where id=1"):
            remind = row[0]
            if remind == "True":
                self.ui.remindBox.setChecked(True)
            else:
                self.ui.remindBox.setChecked(False)
 
        #follower
 
        for row in cursor.execute(f"SELECT follow FROM user where id=1"):
            follow = row[0]
            if follow == "True":
                self.ui.followBox.setChecked(True)
            else:
                self.ui.followBox.setChecked(False)
 
        for row in cursor.execute(f"SELECT like FROM user where id=1"):
            like = row[0]
            if like == "True":
                self.ui.likeBox.setChecked(True)
            else:
                self.ui.likeBox.setChecked(False)
 
        for row in cursor.execute(f"SELECT comment FROM user where id=1"):
            comment = row[0]
            if comment == "True":
                self.ui.commentBox.setChecked(True)
            else:
                self.ui.commentBox.setChecked(False)
 
        for row in cursor.execute(f"SELECT mediaCount FROM user where id=1"):
            mediaCount = row[0]
            self.ui.mediaCount.setValue(mediaCount)
        for row in cursor.execute(f"SELECT mediaCount2 FROM user where id=1"):
            mediaCount2 = row[0]
            self.ui.mediaCount_2.setValue(mediaCount2)
        for row in cursor.execute(f"SELECT user FROM user where id=1"):
            user = row[0]
            self.ui.userEdit.setText(user)
        for row in cursor.execute(f"SELECT followCount FROM user where id=1"):
            followCount = row[0]
            self.ui.followCount.setValue(followCount)
        for row in cursor.execute(f"SELECT likeCount FROM user where id=1"):
            likeCount = row[0]
            self.ui.likeCount.setValue(likeCount)
        for row in cursor.execute(f"SELECT commentCount FROM user where id=1"):
            commentCount = row[0]
            self.ui.commentCount.setValue(commentCount)
        for row in cursor.execute(f"SELECT commentText FROM user where id=1"):
            commentText = row[0]
            self.ui.commentTextEdit.setPlainText(commentText)
 
    def liking_follow(self):
        username = self.ui.loginEdit.text()
        password = self.ui.passEdit.text()
 
        browser = self.ui.checkBox.isChecked()
        remind = self.ui.remindBox.isChecked()
 
        user = self.ui.userEdit.text()
 
        if len(username) > 0:
            pass
        else:
            print("введите логин")
            return
        if len(password) > 0:
            pass
        else:
            print("введите пароль")
            return
        if len(user) > 0:
            pass
        else:
            print("введите конкурента")
            return
 
        # присваивание переменных для полей
 
        amount =  self.ui.mediaCount.text()
        media_per = self.ui.mediaCount_2.text()
        follow = self.ui.followCount.text()
        like = self.ui.likeCount.text()
        comment_count = self.ui.commentCount.text()
        comment = self.ui.commentTextEdit.toPlainText()
        user_count = self.ui.userCount.text()
        following = self.ui.followBox.isChecked()
        liking = self.ui.likeBox.isChecked()
        commenting = self.ui.commentBox.isChecked()
 
 
        # добавление данных последней сессии в бд
        conn = sqlite3.connect("session.db")
        cursor = conn.cursor()
        cursor.execute(f"UPDATE instabot SET user = '{username}' WHERE id = 1")
        cursor.execute(f"UPDATE instabot SET show = '{browser}' WHERE id = 1")
        cursor.execute(f"UPDATE instabot SET remind = '{remind}' WHERE id = 1")
 
        if self.ui.remindBox.isChecked():
            cursor.execute(f"UPDATE instabot SET password = '{password}' WHERE id = 1")
        else:
            cursor.execute(f"UPDATE instabot SET password = '' WHERE id = 1")
        conn.commit()
 
        # добавление данных user tab
        cursor.execute(f"UPDATE user SET mediaCount = '{amount}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET mediaCount2 = '{media_per}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET user = '{user}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET followCount = '{follow}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET follow = '{following}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET likeCount = '{like}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET like = '{liking}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET commentCount = '{comment_count}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET comment = '{commenting}' WHERE id = 1")
        cursor.execute(f"UPDATE user SET commentText = '{comment}' WHERE id = 1")
        conn.commit()
 
        # Отключение интерфейса
        self.ui.loginEdit.setDisabled(True)
        self.ui.passEdit.setDisabled(True)
        self.ui.startButton.setDisabled(True)
        self.ui.checkBox.setDisabled(True)
        self.ui.mediaCount.setDisabled(True)
        self.ui.mediaCount_2.setDisabled(True)
        self.ui.followCount.setDisabled(True)
        self.ui.likeCount.setDisabled(True)
        self.ui.commentCount.setDisabled(True)
        self.ui.commentTextEdit.setDisabled(True)
        self.ui.userCount.setDisabled(True)
        self.ui.userEdit.setDisabled(True)
        self.ui.followBox.setDisabled(True)
        self.ui.likeBox.setDisabled(True)
        self.ui.commentBox.setDisabled(True)
        # self.ui.tabWidget.setDisabled(True)
        self.ui.remindBox.setDisabled(True)
 
 
        # Передача переменных в отдельный поток и его запуск
        self.mythread = InstaBot(username, password, browser, amount, media_per, follow, like, comment_count, comment,user, user_count, following,liking,
                                 commenting)
        self.mythread.start()
 
    def stop(self):
        self.mythread.terminate()
        self.ui.loginEdit.setDisabled(False)
        self.ui.passEdit.setDisabled(False)
        self.ui.startButton.setDisabled(False)
        self.ui.checkBox.setDisabled(False)
        self.ui.mediaCount.setDisabled(False)
        self.ui.mediaCount_2.setDisabled(False)
        self.ui.followCount.setDisabled(False)
        self.ui.likeCount.setDisabled(False)
        self.ui.commentCount.setDisabled(False)
        self.ui.commentTextEdit.setDisabled(False)
        self.ui.userCount.setDisabled(False)
        self.ui.userEdit.setDisabled(False)
        self.ui.followBox.setDisabled(False)
        self.ui.likeBox.setDisabled(False)
        self.ui.commentBox.setDisabled(False)
        # self.ui.tabWidget.setDisabled(True)
        self.ui.remindBox.setDisabled(False)
 
    def telegram(self):
        window = telegramWindow(self)
        window.show()
 
 
class telegramWindow(QtWidgets.QWidget):
    def __init__(self, parent=MyWin):
        super().__init__(parent, QtCore.Qt.Window)
        self.modal = Ui_Form()
        self.modal.setupUi(self)
        self.setWindowModality(2)
        self.modal.pushButton.clicked.connect(self.save)
 
        # обновление полей
        conn = sqlite3.connect("session.db")
        cursor = conn.cursor()
        for row in cursor.execute(f"SELECT token FROM telegram where id=1"):
            token = row[0]
            self.modal.tokenEdit.setText(token)
        for row in cursor.execute(f"SELECT nick FROM telegram where id=1"):
            nick = row[0]
            self.modal.lineEdit.setText(nick)
 
    def save(self):
        token = self.modal.tokenEdit.text()
        nick = self.modal.lineEdit.text()
 
        conn = sqlite3.connect("session.db")
        cursor = conn.cursor()
        cursor.execute(f"UPDATE telegram SET token = '{token}' WHERE id = 1")
        cursor.execute(f"UPDATE telegram SET nick = '{nick}' WHERE id = 1")
        conn.commit()
        self.close()
 
 
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: mrvol

Короткий ответ: Падает тред, который не связан с консолью, поэтому он не может туда ничего вывести. Падает из за ошибки в коде и наверняка простой.

Длинный ответ. Вы используете треды (QtCore.QThread). Краш конечно не из-за них, но трейсбек в консоле отсутствует из за них. Программы, использующие потоки или треды очень сложно отлаживать. Я бы посоветовал, либо отказаться от тредов, либо отладить программу без них, а потом уже обертывать ее в тред.

→ Ссылка