Почему мой pyqt GUI зависает при запуске моей программы? - PullRequest
0 голосов
/ 08 апреля 2019

Я создал приложение сервер / клиент и мне нужно добавить графический интерфейс на стороне сервера. До сих пор я тестировал и запускал его через окно терминала cmd. Однако когда я пытаюсь реализовать pyqt GUI, окно GUI зависает, а затем вылетает.

Я подозреваю, что проблема заключается в серверной программе, которая создает два потока, где оба являются бесконечными циклами "while true", один ожидает ввода через окно cmd, а другой ожидает подключения (sock.accept ()).

Я думал, что смогу решить эту проблему, заставив QApplication (gui) создать экземпляр серверной программы как QThread, но, похоже, это не работает.

Есть предложения как это исправить? Я думал, что это будет довольно распространенным явлением для программ, использующих бесконечные циклы while и графический интерфейс сверху?

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setupUi(self)
        self.show()
        self.server = ServerThread()
        self.pushButton.clicked.connect(self.server.main)

class ServerThread(QThread):
    def __init__(self):
        QThread.__init__(self)
        self.server = None

    def create_workers(self):
        """ Create worker threads (will die when main exits) """
        self.server = Server()
        self.server.register_signal_handler()
        for _ in range(NUMBER_OF_THREADS):
            t = threading.Thread(target=self.work, args=(self.server,))
            t.daemon = True
            t.start()
        return

    def work(self, server):
        """ Do the next job in the queue (thread for handling connections, another for sending commands)
        :param server:
        """
        while True:
            x = queue.get()
            if x == 1:
                self.server.create_mcast_socket()
                self.server.create_tcp_socket()
                self.server.bind_tcp_socket()
                self.server.accept_connections()
            if x == 2:
                self.server.start_turtle()
            queue.task_done()
        return

    def create_jobs(self):
        """ Each list item is a new job """
        for x in JOB_NUMBER:
            queue.put(x)
        queue.join()
        return

    def main(self):
        self.create_workers()
        self.create_jobs()

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    app.exec_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...