qthread: destroyed while thread is still running как исправить?

Как устранить данную ошибку ?

Main.py

import sys
import os
import sqlite3
import asyncio
import platform
from des import *
import subprocess
from PyQt5.Qt import *
from Main_setings_ip import *
from PyQt5 import QtCore, QtGui, QtWidgets

#----------------------------------------------- 1 пинг
class WorkThread(QtCore.QThread):
    threadSignal = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, dictIP):
        super().__init__()
        self.dictIP = dictIP

    def run(self):
        while True:
            for k, v in self.dictIP.items():
                if v[2] == 0:
                    response = subprocess.run(["ping", k, "-n", "1", "-w", "100"], shell=True,stdout=subprocess.PIPE)
                    response = response.returncode
                    self.msleep(1)
                    self.threadSignal.emit(response, k, v)
#            self.finished.emit()

#----------------------------------------------- 2 пинг
class WorkThread_1(QtCore.QThread):
    threadSignal_1 = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, k, v):
        super().__init__()
        self.k_1 = k
        self.v_1 = v

    def run(self):
        response_1 = subprocess.run(["ping", self.k_1, "-n", "4", "-w", "100"], shell=True,stdout=subprocess.PIPE)
        response_1 = response_1.returncode
        self.msleep(1)
        self.threadSignal_1.emit(response_1, self.k_1, self.v_1)
#------------------------------------------------
 
class MyWin(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.startThread)
        self.ui.pushButton_2.clicked.connect(self.clear_plainText)

        self.thread = None
        
        self.ui.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        self.ui.tableWidget.horizontalHeader().setMinimumSectionSize(0)
        self.ui.plainTextEdit.setReadOnly(True)

        self.row_count = 1

        self.tab()

    def tab(self):
        # Подключение к БД
        sqlite_connection = sqlite3.connect("New.db")   
        cursor = sqlite_connection.cursor()
        sqlite_select_query = """SELECT ip FROM ips"""
        cursor.execute(sqlite_select_query)
        records = cursor.fetchall()
        cursor.close()
        sqlite_connection.close()

        # Перебор ip адресов
        for row, value in enumerate(records):
            self.ui.tableWidget.setRowCount(self.row_count)
            item = QtWidgets.QTableWidgetItem(str(value[0]))
            item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.ui.tableWidget.setItem(row, 0, item)
            self.row_count += 1

    def clear_plainText(self):
            self.ui.plainTextEdit.clear()

    def startThread(self):
        dictIP = {}
        for row in range(self.ui.tableWidget.rowCount()):
            item = self.ui.tableWidget.item(row, 0)
            if not item.checkState():
                item.setBackground(QtGui.QColor("white"))
            dictIP[item.text()] = (row, 0, item.checkState())

        if self.thread is None:
            self.thread = WorkThread(dictIP)
            self.thread.threadSignal.connect(self.on_threadSignal)
#            self.thread.finished.connect(self.threadFinished)
            self.thread.start()
            self.ui.pushButton.setText("Stop thread")

            style_stop = """QPushButton {
                         background-color: #fa7f72;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_stop)
        else:
            self.thread.terminate()
            self.thread = None
            self.ui.pushButton.setText("Start thread")

            style_start = """QPushButton {
                         background-color: #54e346;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_start)

#----------------------------------------------- условия
    def on_threadSignal(self, response, k, v):
        #print(response, k, v)
        item = self.ui.tableWidget.item(v[0], v[1])
        #item.setCheckState(QtCore.Qt.Checked)
        if response == 1:
            self.thread_1 = WorkThread_1(k, v)
            self.thread_1.threadSignal_1.connect(self.on_threadSignal_1)        
            self.thread_1.start()

        else:
            item.setBackground(QtGui.QColor("#54e346"))    

    def on_threadSignal_1(self, response_1, k_1, v_1):
        #print(response_1, k_1, v_1)
        item_1 = self.ui.tableWidget.item(v_1[0], v_1[1])
        #item_1.setCheckState(QtCore.Qt.Checked)
        if response_1:
            item_1.setBackground(QtGui.QColor("#fa7f72"))

            sqlite_connection = sqlite3.connect("New.db")
            cursor = sqlite_connection.cursor()

            sqlite_select_query = """SELECT * FROM ips WHERE ip = '{}'""".format(k_1)
            cursor.execute(sqlite_select_query)
            records = cursor.fetchall()

            # Вставляем данные в PlainText 
            self.ui.plainTextEdit.setReadOnly(False)
            for row in records:
                self.ui.plainTextEdit.appendPlainText(str(row[4]) + " | " + str(row[1]) + " | " + str(row[2]) + "\n" +
                                                      str(row[3]) + "\n")
            self.ui.plainTextEdit.setReadOnly(True)
        else:
            item_1.setBackground(QtGui.QColor("#ffaa00"))
#----------------------------------------------- 

    # def threadFinished(self):
    #     self.thread = None
    #     self.ui.pushButton.setText("Start thread")

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    sys.exit(app.exec_())

des.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(715, 469)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/ico/Python.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setStyleSheet("background-color:#b2b2b2;")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setStyleSheet("background-color: #b2b2b2;")
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setToolTip("")
        self.tab_2.setObjectName("tab_2")
        self.gridLayout = QtWidgets.QGridLayout(self.tab_2)
        self.gridLayout.setObjectName("gridLayout")
        spacerItem = QtWidgets.QSpacerItem(153, 243, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 4, 2, 2, 1)
        spacerItem1 = QtWidgets.QSpacerItem(54, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 2, 3, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem2, 5, 3, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_3.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_3.setMaximumSize(QtCore.QSize(136, 31))
        self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_3.setStyleSheet("QPushButton {\n"
"    background-color: #FFAA00;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout.addWidget(self.pushButton_3, 0, 1, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(75, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem3, 0, 3, 1, 1)
        self.tableWidget = QtWidgets.QTableWidget(self.tab_2)
        self.tableWidget.setMaximumSize(QtCore.QSize(136, 16777215))
        self.tableWidget.setStyleSheet("background-color: #b2b2b2;")
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(1)
        self.tableWidget.setRowCount(1)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        self.gridLayout.addWidget(self.tableWidget, 1, 1, 5, 1)
        self.pushButton = QtWidgets.QPushButton(self.tab_2)
        self.pushButton.setMinimumSize(QtCore.QSize(133, 31))
        self.pushButton.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setStyleSheet("QPushButton {\n"
"    background-color: #54e346;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 2, 1, 1)
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.tab_2)
        self.plainTextEdit.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.ForbiddenCursor))
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 6, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_2.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_2.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_2.setStyleSheet("QPushButton {\n"
"    background-color: #00b8ef;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 1, 2, 1, 1)
        self.pushButton_5 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_5.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_5.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_5.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_5.setStyleSheet("QPushButton {\n"
"    background-color: #00b8ef;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout.addWidget(self.pushButton_5, 2, 2, 1, 1)
        self.tabWidget.addTab(self.tab_2, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_3)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.label = QtWidgets.QLabel(self.tab_3)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.tab_3)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 2, 1, 1)
        spacerItem4 = QtWidgets.QSpacerItem(285, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem4, 0, 4, 1, 1)
        self.comboBox = QtWidgets.QComboBox(self.tab_3)
        self.comboBox.setMinimumSize(QtCore.QSize(161, 31))
        self.comboBox.setObjectName("comboBox")
        self.gridLayout_2.addWidget(self.comboBox, 1, 0, 1, 2)
        self.comboBox_2 = QtWidgets.QComboBox(self.tab_3)
        self.comboBox_2.setMinimumSize(QtCore.QSize(69, 31))
        self.comboBox_2.setObjectName("comboBox_2")
        self.gridLayout_2.addWidget(self.comboBox_2, 1, 2, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.tab_3)
        self.pushButton_4.setMinimumSize(QtCore.QSize(133, 31))
        self.pushButton_4.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_4.setStyleSheet("QPushButton {\n"
"    background-color: #54e346;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_2.addWidget(self.pushButton_4, 1, 3, 1, 1)
        spacerItem5 = QtWidgets.QSpacerItem(285, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem5, 1, 4, 1, 1)
        spacerItem6 = QtWidgets.QSpacerItem(20, 297, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem6, 2, 1, 1, 1)
        self.tabWidget.addTab(self.tab_3, "")
        self.verticalLayout.addWidget(self.tabWidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 715, 21))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action123 = QtWidgets.QAction(MainWindow)
        self.action123.setObjectName("action123")
        self.action123_2 = QtWidgets.QAction(MainWindow)
        self.action123_2.setObjectName("action123_2")
        self.menu.addAction(self.action123)
        self.menu.addAction(self.action123_2)
        self.menubar.addAction(self.menu.menuAction())

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Мониторинг"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Мониторинг"))
        self.pushButton_3.setToolTip(_translate("MainWindow", "Изменение ip и данных"))
        self.pushButton_3.setText(_translate("MainWindow", "Настройка ip"))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("MainWindow", "1"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "ip"))
        self.pushButton.setToolTip(_translate("MainWindow", "Пинг старт/стоп"))
        self.pushButton.setText(_translate("MainWindow", "Start"))
        self.plainTextEdit.setToolTip(_translate("MainWindow", "Лог панель"))
        self.pushButton_2.setToolTip(_translate("MainWindow", "Отчистить поле лог панели"))
        self.pushButton_2.setText(_translate("MainWindow", "Clear"))
        self.pushButton_5.setToolTip(_translate("MainWindow", "Обновить таблицу"))
        self.pushButton_5.setText(_translate("MainWindow", "Updae"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Пинг ip"))
        self.label.setText(_translate("MainWindow", "ip аддреса"))
        self.label_2.setText(_translate("MainWindow", "Порты"))
        self.pushButton_4.setText(_translate("MainWindow", "Подключиться"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Мониторинг"))
        self.menu.setTitle(_translate("MainWindow", "до"))
        self.action123.setText(_translate("MainWindow", "123"))
        self.action123_2.setText(_translate("MainWindow", "123"))
import res_rc

Шаблон бд

import sqlite3

# Добавление данных в таблицы

try:
    connect = sqlite3.connect("New.db")
    cursor = connect.cursor()
    print("База данных подключена к SQLite")
    
    cursor.execute("""CREATE TABLE IF NOT EXISTS ips(
                      ip INTEGER,
                      Gor TEXT,
                      Yi TEXT,
                      Location TEXT);""")

    connect.commit()

    records = [[f"192.168.{i}.9", "None", "None", "None"] for i in range(1, 101)]
    cursor.executemany("INSERT INTO ips VALUES (?, ?, ?, ?)", records)
    connect.commit()

    print("Запись успешно добавлена")
    cursor.close()

except sqlite3.Error as error:
    print("Ошибка при работе с SQLite", error)

finally:
    if connect:
        connect.close()
        print("Соединение с SQLite закрыто")

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

Автор решения: S. Nick

Я не совсем понимаю вашу логику и как вы синхронизируете работу экземпляров класса WorkThread_1.

Я создал список, в который помещаю объекты thread_1 и проблема как бы ушла, попробуйте:

import sys
import os
import sqlite3
import asyncio
import platform
import subprocess
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *

#from Main_setings_ip import *

#from des import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(715, 469)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/ico/Python.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setStyleSheet("background-color:#b2b2b2;")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setStyleSheet("background-color: #b2b2b2;")
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setToolTip("")
        self.tab_2.setObjectName("tab_2")
        self.gridLayout = QtWidgets.QGridLayout(self.tab_2)
        self.gridLayout.setObjectName("gridLayout")
        spacerItem = QtWidgets.QSpacerItem(153, 243, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 4, 2, 2, 1)
        spacerItem1 = QtWidgets.QSpacerItem(54, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 2, 3, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem2, 5, 3, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_3.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_3.setMaximumSize(QtCore.QSize(136, 31))
        self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_3.setStyleSheet("QPushButton {\n"
"    background-color: #FFAA00;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout.addWidget(self.pushButton_3, 0, 1, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(75, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem3, 0, 3, 1, 1)
        self.tableWidget = QtWidgets.QTableWidget(self.tab_2)
        self.tableWidget.setMaximumSize(QtCore.QSize(136, 16777215))
        self.tableWidget.setStyleSheet("background-color: #b2b2b2;")
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(1)
        self.tableWidget.setRowCount(1)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        self.gridLayout.addWidget(self.tableWidget, 1, 1, 5, 1)
        self.pushButton = QtWidgets.QPushButton(self.tab_2)
        self.pushButton.setMinimumSize(QtCore.QSize(133, 31))
        self.pushButton.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton.setStyleSheet("QPushButton {\n"
"    background-color: #54e346;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 2, 1, 1)
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.tab_2)
        self.plainTextEdit.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.ForbiddenCursor))
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 6, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_2.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_2.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_2.setStyleSheet("QPushButton {\n"
"    background-color: #00b8ef;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 1, 2, 1, 1)
        self.pushButton_5 = QtWidgets.QPushButton(self.tab_2)
        self.pushButton_5.setMinimumSize(QtCore.QSize(0, 31))
        self.pushButton_5.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_5.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.pushButton_5.setStyleSheet("QPushButton {\n"
"    background-color: #00b8ef;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_5.setObjectName("pushButton_5")
        self.gridLayout.addWidget(self.pushButton_5, 2, 2, 1, 1)
        self.tabWidget.addTab(self.tab_2, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_3)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.label = QtWidgets.QLabel(self.tab_3)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.tab_3)
        font = QtGui.QFont()
        font.setPointSize(11)
        font.setBold(False)
        font.setWeight(50)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.gridLayout_2.addWidget(self.label_2, 0, 2, 1, 1)
        spacerItem4 = QtWidgets.QSpacerItem(285, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem4, 0, 4, 1, 1)
        self.comboBox = QtWidgets.QComboBox(self.tab_3)
        self.comboBox.setMinimumSize(QtCore.QSize(161, 31))
        self.comboBox.setObjectName("comboBox")
        self.gridLayout_2.addWidget(self.comboBox, 1, 0, 1, 2)
        self.comboBox_2 = QtWidgets.QComboBox(self.tab_3)
        self.comboBox_2.setMinimumSize(QtCore.QSize(69, 31))
        self.comboBox_2.setObjectName("comboBox_2")
        self.gridLayout_2.addWidget(self.comboBox_2, 1, 2, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.tab_3)
        self.pushButton_4.setMinimumSize(QtCore.QSize(133, 31))
        self.pushButton_4.setMaximumSize(QtCore.QSize(133, 31))
        self.pushButton_4.setStyleSheet("QPushButton {\n"
"    background-color: #54e346;\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: white;\n"
"}\n"
"QPushButton:pressed {\n"
"    color: #626AB0;\n"
"    background-color: #D5D4D4;\n"
"}")
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_2.addWidget(self.pushButton_4, 1, 3, 1, 1)
        spacerItem5 = QtWidgets.QSpacerItem(285, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem5, 1, 4, 1, 1)
        spacerItem6 = QtWidgets.QSpacerItem(20, 297, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem6, 2, 1, 1, 1)
        self.tabWidget.addTab(self.tab_3, "")
        self.verticalLayout.addWidget(self.tabWidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 715, 21))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action123 = QtWidgets.QAction(MainWindow)
        self.action123.setObjectName("action123")
        self.action123_2 = QtWidgets.QAction(MainWindow)
        self.action123_2.setObjectName("action123_2")
        self.menu.addAction(self.action123)
        self.menu.addAction(self.action123_2)
        self.menubar.addAction(self.menu.menuAction())

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Мониторинг"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Мониторинг"))
        self.pushButton_3.setToolTip(_translate("MainWindow", "Изменение ip и данных"))
        self.pushButton_3.setText(_translate("MainWindow", "Настройка ip"))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("MainWindow", "1"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "ip"))
        self.pushButton.setToolTip(_translate("MainWindow", "Пинг старт/стоп"))
        self.pushButton.setText(_translate("MainWindow", "Start"))
        self.plainTextEdit.setToolTip(_translate("MainWindow", "Лог панель"))
        self.pushButton_2.setToolTip(_translate("MainWindow", "Отчистить поле лог панели"))
        self.pushButton_2.setText(_translate("MainWindow", "Clear"))
        self.pushButton_5.setToolTip(_translate("MainWindow", "Обновить таблицу"))
        self.pushButton_5.setText(_translate("MainWindow", "Updae"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Пинг ip"))
        self.label.setText(_translate("MainWindow", "ip аддреса"))
        self.label_2.setText(_translate("MainWindow", "Порты"))
        self.pushButton_4.setText(_translate("MainWindow", "Подключиться"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Мониторинг"))
        self.menu.setTitle(_translate("MainWindow", "до"))
        self.action123.setText(_translate("MainWindow", "123"))
        self.action123_2.setText(_translate("MainWindow", "123"))
#import res_rc


#-------------------------------------------- 1 пинг
class WorkThread(QtCore.QThread):
    threadSignal = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, dictIP):
        super().__init__()
        self.dictIP = dictIP

    def run(self):
        while True:
            for k, v in self.dictIP.items():
                if v[2] == 0:
                    response = subprocess.run(["ping", k, "-n", "1", "-w", "100"], shell=True,stdout=subprocess.PIPE)
                    response = response.returncode
                    self.msleep(1)
                    self.threadSignal.emit(response, k, v)
#            self.finished.emit()

#----------------------------------------------- 2 пинг
class WorkThread_1(QtCore.QThread):
    threadSignal_1 = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, k, v):
        super().__init__()
        self.k_1 = k
        self.v_1 = v

    def run(self):
        response_1 = subprocess.run(["ping", self.k_1, "-n", "4", "-w", "100"], shell=True,stdout=subprocess.PIPE)
        response_1 = response_1.returncode
        self.msleep(1)
        self.threadSignal_1.emit(response_1, self.k_1, self.v_1)
#------------------------------------------------
 
class MyWin(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.startThread)
        self.ui.pushButton_2.clicked.connect(self.clear_plainText)

        self.thread = None
        
        self.ui.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        self.ui.tableWidget.horizontalHeader().setMinimumSectionSize(0)
        self.ui.plainTextEdit.setReadOnly(True)

        self.row_count = 1
        self.tab()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        self.thread_1_list = []
        self.thread_1_num = 0
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


    def tab(self):
        # Подключение к БД
        sqlite_connection = sqlite3.connect("New.db")   
        cursor = sqlite_connection.cursor()
        sqlite_select_query = """SELECT ip FROM ips"""
        cursor.execute(sqlite_select_query)
        records = cursor.fetchall()
        cursor.close()
        sqlite_connection.close()

        # Перебор ip адресов
        for row, value in enumerate(records):
            self.ui.tableWidget.setRowCount(self.row_count)
            item = QtWidgets.QTableWidgetItem(str(value[0]))
            item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.ui.tableWidget.setItem(row, 0, item)
            self.row_count += 1

    def clear_plainText(self):
            self.ui.plainTextEdit.clear()

    def startThread(self):
        dictIP = {}
        for row in range(self.ui.tableWidget.rowCount()):
            item = self.ui.tableWidget.item(row, 0)
            if not item.checkState():
                item.setBackground(QtGui.QColor("white"))
            dictIP[item.text()] = (row, 0, item.checkState())

        if self.thread is None:
            self.thread = WorkThread(dictIP)
            self.thread.threadSignal.connect(self.on_threadSignal)
#            self.thread.finished.connect(self.threadFinished)
            self.thread.start()
            self.ui.pushButton.setText("Stop thread")

            style_stop = """QPushButton {
                         background-color: #fa7f72;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_stop)
        else:
            self.thread.terminate()
            self.thread = None
            self.ui.pushButton.setText("Start thread")

            style_start = """QPushButton {
                         background-color: #54e346;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_start)

#----------------------------------------------- условия
    def on_threadSignal(self, response, k, v):
        #print(response, k, v)
        item = self.ui.tableWidget.item(v[0], v[1])
        #item.setCheckState(QtCore.Qt.Checked)
        
        if response == 1:
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
            '''
            self.thread_1 = WorkThread_1(k, v)
            self.thread_1.threadSignal_1.connect(self.on_threadSignal_1)        
            self.thread_1.start()
            '''

            thread_1 = WorkThread_1(k, v)
            self.thread_1_list.append(thread_1)                                
            self.thread_1_list[self.thread_1_num].threadSignal_1.connect(self.on_threadSignal_1)        
            self.thread_1_list[self.thread_1_num].start()                    
            self.thread_1_num += 1
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                

        else:
            item.setBackground(QtGui.QColor("#54e346"))    

    def on_threadSignal_1(self, response_1, k_1, v_1):
        #print(response_1, k_1, v_1)
        item_1 = self.ui.tableWidget.item(v_1[0], v_1[1])
        #item_1.setCheckState(QtCore.Qt.Checked)
        if response_1:
            item_1.setBackground(QtGui.QColor("#fa7f72"))

            sqlite_connection = sqlite3.connect("New.db")
            cursor = sqlite_connection.cursor()

            sqlite_select_query = """SELECT * FROM ips WHERE ip = '{}'""".format(k_1)
            cursor.execute(sqlite_select_query)
            records = cursor.fetchall()

            # Вставляем данные в PlainText 
# ?             self.ui.plainTextEdit.setReadOnly(False)
            for row in records:
# ? IndexError: tuple index out of range
# ?   ------------------------------------------------------>  4 <---- ?????????????????????
#                self.ui.plainTextEdit.appendPlainText(str(row[4]) + " | " + str(row[1]) + " | " + str(row[2]) + "\n" +
#                                                      str(row[3]) + "\n")
                self.ui.plainTextEdit.appendPlainText(
                    f'{row[0]} | {row[1]} | {row[2]}\n{row[3]}\n')                   #  +++      

# ?             self.ui.plainTextEdit.setReadOnly(True)
        else:
            item_1.setBackground(QtGui.QColor("#ffaa00"))


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    sys.exit(app.exec_())
    
→ Ссылка