@Hukyl

Python: Как выйти из loop (asyncio)?

Мне нужно разобраться в async(qt)-pyside-коде, в котором есть подключение к серверу. Должен быть флаг, который проверяет, нужно ли опять подключаться. Я не понимаю, как его сделать, и можно ли его сделать вообще (я немного чайник в этой области). Помогите пожалуйста ( уже третий день бьюсь )

Вот код:
(вид класса Chat есть чуть повыше в коде)

from PySide2.QtWidgets import *
from PySide2.QtWidgets import QMainWindow
import asyncio
from asyncio import transports
from asyncqt import QEventLoop

host = "127.0.0.1"
port = 4000

class ClientProtocol(asyncio.Protocol):
    transport: transports.Transport
    window: 'Chat'

    def __init__(self, chat):
        self.window = chat
        self.flag = False  # Сам флаг

    def data_received(self, data: bytes):
        decoded = data.decode()
        self.window.plainTextEdit.appendPlainText(decoded)        
        if decoded == "True":
            self.flag = True  

    def connection_made(self, transport: transports.Transport):
        self.transport = transport
        print("Conn made")

    def connection_lost(self, exception):
        print("Conn lost")


class Chat(QMainWindow, Ui_JustMessenger):
    protocol: ClientProtocol

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.send_message)
        self.setWindowTitle("JustMessenger")
        self.pushButton.setShortcut("Return")

    def send_message(self):
        message = self.lineEdit.text()
        self.lineEdit.clear()
        self.protocol.transport.write(message.encode())

    def create_protocol(self):
        self.protocol = ClientProtocol(self)
        return self.protocol
    
    """Проверка флага должна быть
    (по крайней мере мне так кажется)
    где-то здесь   |
                  \|/   """
    async def start(self):                                            
        self.show()                                                      
                                                                               
        loop = asyncio.get_running_loop()                  
                                                                               
        with open('ip_enter.txt') as file:                      
            ip = file.readline().split()                             
            coroutine = loop.create_connection(          
                self.create_protocol,                               
                host,                                                       
                port                                                         
            )                                                                  
                                                                               
        await asyncio.wait_for(coroutine, 1000)         


application = QApplication()
chat = Chat()
loop = QEventLoop(application)
asyncio.set_event_loop(loop)
loop.create_task(chat.start())
loop.run_forever()
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы