Из за чего краш программы на 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). Краш конечно не из-за них, но трейсбек в консоле отсутствует из за них. Программы, использующие потоки или треды очень сложно отлаживать. Я бы посоветовал, либо отказаться от тредов, либо отладить программу без них, а потом уже обертывать ее в тред.