Как исправить зависание програмы PyQt?
Есть такой код, раньше работал щас нет (меджик)
import asyncio
from asyncio import transports
from PySide2.QtWidgets import QMainWindow, QApplication
from asyncqt import QEventLoop
from app.interface import Ui_MainWindow
class ClientProtocol(asyncio.Protocol):
transport: transports.Transport
window: 'MainWindow'
def __init__(self, chat_window: 'MainWindow'):
self.window = chat_window
def data_received(self, data: bytes):
decoded = data.decode()
self.window.append_text(decoded)
def send_data(self, message: str):
encoded = message.encode()
self.transport.write(encoded)
def connection_made(self, transport: transports.Transport):
self.window.append_text("Подключено")
self.transport = transport
def connection_lost(self, exception):
self.window.append_text("Отключено")
class MainWindow(QMainWindow, Ui_MainWindow):
protocol: ClientProtocol
def __init__(self):
super().__init__()
self.setupUi(self)
self.message_button.clicked.connect(self.button_handler)
def button_handler(self):
message_text = self.message_input.text()
self.message_input.clear()
self.protocol.send_data(message_text)
def append_text(self, content: str):
self.message_box.appendPlainText(content)
def build_protocol(self):
self.protocol = ClientProtocol(self)
return self.protocol
async def start(self):
self.show()
event_loop = asyncio.get_running_loop()
coroutine = event_loop.create_connection(
self.build_protocol,
"127.0.0.1",
8888
)
await asyncio.wait_for(coroutine, 1000)
app = QApplication()
loop = QEventLoop(app)
asyncio.set_event_loop(loop)
window = MainWindow()
loop.create_task(window.start())
loop.run_forever()
Interface.py
После строчки loop.run_forever() зависает Как это исправить заранее спасибо
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Взял сервер (написанный на PyQt !) со своего ответа Передача данных через socket в локальной сети python
В вашем примере поменял импорты под себя (PyQt5) и свой порт 9090.
Все работает !
#from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint, QRect, QSize, QUrl, Qt)
#from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont, QFontDatabase, QIcon,
# QLinearGradient, QPalette, QPainter, QPixmap, QRadialGradient)
#from PySide2.QtWidgets import *
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.Qt import *
import asyncio
from asyncio import transports
from asyncqt import QEventLoop
#from app.interface import Ui_MainWindow
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(372, 645)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.message_box = QPlainTextEdit(self.centralwidget)
self.message_box.setObjectName(u"message_box")
self.message_box.setReadOnly(True)
self.verticalLayout.addWidget(self.message_box)
self.message_input = QLineEdit(self.centralwidget)
self.message_input.setObjectName(u"message_input")
self.verticalLayout.addWidget(self.message_input)
self.message_button = QPushButton(self.centralwidget)
self.message_button.setObjectName(u"message_button")
self.verticalLayout.addWidget(self.message_button)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"Это ваш Клиент", None))
self.message_box.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Connecting...", None))
self.message_input.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Type your message here...", None))
self.message_button.setText(QCoreApplication.translate("MainWindow", u"Send", None))
class ClientProtocol(asyncio.Protocol):
transport: transports.Transport
window: 'MainWindow'
def __init__(self, chat_window: 'MainWindow'):
self.window = chat_window
def data_received(self, data: bytes):
decoded = data.decode()
self.window.append_text(decoded)
def send_data(self, message: str):
encoded = message.encode()
self.transport.write(encoded)
def connection_made(self, transport: transports.Transport):
self.window.append_text("Подключено")
self.transport = transport
def connection_lost(self, exception):
self.window.append_text("Отключено")
class MainWindow(QMainWindow, Ui_MainWindow):
protocol: ClientProtocol
def __init__(self):
super().__init__()
self.setupUi(self)
self.message_button.clicked.connect(self.button_handler)
def button_handler(self):
message_text = self.message_input.text()
self.message_input.clear()
self.protocol.send_data(message_text)
def append_text(self, content: str):
self.message_box.appendPlainText(content)
def build_protocol(self):
self.protocol = ClientProtocol(self)
return self.protocol
async def start(self):
print(f'\n async def start(self): Привет \n')
self.show()
event_loop = asyncio.get_running_loop()
coroutine = event_loop.create_connection(
self.build_protocol,
"127.0.0.1",
9090 # 8888
)
await asyncio.wait_for(coroutine, 1000)
app = QApplication(sys.argv) # sys.argv PyQt5
loop = QEventLoop(app)
asyncio.set_event_loop(loop)
window = MainWindow()
loop.create_task(window.start())
loop.run_forever()
