@OnionCrew
Coder

Как нормально настроить потоки в коде с использованием PyQt?

Никак не получается подвязать многопоточность к одной из моих функций в программе. Программа просто не реагирует на нажатие кнопки.Пытался изменить значение "change_value" на значение переменной "lineEdit_2" - тот же самый результат.В чем моя ошибка?

import urllib.request
import time
import json
import socket
import requests, sys
import ipaddress

from urllib.request import Request, urlopen
import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox, QLineEdit
from PyQt5.QtCore import QThread,pyqtSignal

#Сигнал
class mythread(QThread):
    change_value = pyqtSignal(int)


claw)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def showMessageBox(self,title,messege):
        msgBox = QtGui.QMessegeBox()
        msgBox.setIcon(QtGui.QMessegeBox.Warning)
        msgBox.setWindowTitle(title)
        msgBox.setText(messege)
        msgBox.setStandardButtons(QtGui.QMessageBox.Ok)
        msgBox.exce_()


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Punch!"))
        self.label.setText(_translate("MainWindow", "               IP"))
        self.label_2.setText(_translate("MainWindow", "                                                              Work place"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Whois Function"))
        self.pushButton_3.setText(_translate("MainWindow", "Punch!"))
        self.label_5.setText(_translate("MainWindow", "               IP"))
        self.label_6.setText(_translate("MainWindow", "                                                              Work place"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Port Scanner "))
        self.label_3.setText(_translate("MainWindow", "               IP"))
        self.label_4.setText(_translate("MainWindow", "                                                              Work place"))
        self.pushButton_2.setText(_translate("MainWindow", "Punch!"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Blacklists checkout "))

     
    ## Ниже функция
    def run(self):
            mas = [20, 21, 22, 23, 25, 42, 43, 53, 67, 69, 80, 110, 115, 123, 137, 138, 139, 143, 161, 179, 443, 445,
                   514, 515,
                   993, 995]
            host = self.lineEdit_2.text()
            try:
                ipaddress.ip_network(host)
                for port in mas:
                    s = socket.socket()
                    s.settimeout(1)
                    try:
                        s.connect((host, port))
                        time.sleep(1.5)
                        per2 = (str(port) + ' port open!')

                        self.textEdit_5.setText(per2)
                        print(per2)
                    except socket.error:
                        per3 = (str(port) + ' port locked!')
                        self.textEdit_5.append(per3)
            except ValueError:
                QMessageBox.warning(self, 'Error!', 'Invalid IP!')

class Window(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self):
            super(Window, self).__init__()
            self.setupUi(self)
          #  self.pushButton_2.clicked.connect(self.list)
           # self.pushButton.clicked.connect(self.whois)
            self.pushButton_3.clicked.connect(self.run)

        #Подключение к потоку
        def stp(self):
            self.thread = mythread()
            self.self.change_value.connect(self.run)
            self.thread.start()






if __name__ == '__main__':
             import sys
             app = QtWidgets.QApplication(sys.argv)
             app.setStyle('Fusion')
             w = Window()  
             w.show()  
             sys.exit(app.exec_())
  • Вопрос задан
  • 569 просмотров
Пригласить эксперта
Ответы на вопрос 2
ZIK1337
@ZIK1337
self.pushButton_3.clicked.connect(self.run)
На
self.pushButton_3.clicked.connect(self.stp)
Т.е. на ту функцию, где запускается поток
Ответ написан
Комментировать
@bbkmzzzz
В таком виде, как приведено тут вообще работать не будет, в таком виде он даже не запустится.
̶Q̶T̶h̶r̶e̶a̶d̶ ̶н̶е̶ ̶н̶а̶с̶л̶е̶д̶н̶и̶к̶ ̶Q̶O̶b̶j̶e̶c̶t̶ ̶и̶ ̶н̶е̶ ̶м̶о̶ж̶е̶т̶ ̶и̶с̶п̶у̶с̶к̶а̶т̶ь̶ ̶с̶и̶г̶н̶а̶л̶ы̶. -> UPD: с определенной версии (в 5.15 точно) QThread наконец-то стал наследником QObject, так что он теперь может сам испускать сигналы. Костыль из класса сигналлера более не актуален

Из соседнего потока нельзя вызывать изменения виджетов окна, только испуская и ловя сигналы.

Не наследуйтесь от двух классов одновременно, огребете странностей.

На тостере есть примеры, как в простом виде компоновать Qt.

В общем виде, через QRunnable, выглядит так:
import sys
import time

from PySide2.QtCore import QThreadPool, QRunnable, Signal, QObject
from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QWidget, QHBoxLayout


class Main(QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        centralWidget = QWidget(self)
        self.setCentralWidget(centralWidget)

        # добавляем компонощик
        self.h_grid = QHBoxLayout(centralWidget)

        self.thread = QThreadPool().globalInstance()
        # добаляем кнопки
        self.button = QPushButton('Start thread')
        self.h_grid.addWidget(self.button)

        self.worker = Worker()
        self.worker.finished.connect(self.__on_finish)

        self.button.clicked.connect(self.start_worker)

    def start_worker(self):
        self.thread.start(self.worker)

    def __on_finish(self):
        print('Воркер закончил работу')


class WorkerSignaller(QObject):
    finished = Signal()


class Worker(QRunnable):
    def __init__(self):
        super(Worker, self).__init__()
        self.signaller = WorkerSignaller()
        self.finished = self.signaller.finished

    def run(self):
        print(f'Я воркер, и я запускаюсь')
        time_to_sleep = 10
        print(f'Я воркер, и я сплю {time_to_sleep} секунд')
        time.sleep(time_to_sleep)
        print(f'Я воркер, и я поспал')
        self.finished.emit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    ex.show()
    sys.exit(app.exec_())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы