所以我有一個 TCP 服務器,它只是回顯我發送給它的任何內容。我有一個發送這些東西的 GUI 客戶端。但是由于我必須保持連接,我似乎無法在一定時間內獲得想要更改一次的標簽,我試圖使用信號,但我似乎做錯了什么,因為應用程式立即凍結當我單擊按鈕連接到服務器時。這是我到目前為止所得到的。此外,最終我需要讓 2 臺服務器向客戶端回顯資訊,我想這會帶來更多問題,我將不得不使用多執行緒。
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import *
import sys
import socket
import time
class MyClient(QMainWindow):
updateText = QtCore.pyqtSignal(str)
def __init__(self):
super(MyClient, self).__init__()
self.setGeometry(200, 200, 300, 300)
self.setWindowTitle("Krs")
self.initSocket()
self.initUI()
def initSocket(self):
self.ClientSocket = socket.socket()
self.s1 = ['127.0.0.1', 1233]
def initUI(self):
self.label = QLabel(self)
self.label.setText("nuthin")
self.label.move(50,50)
self.updateText.connect(self.label.setText)
self.b1 = QtWidgets.QPushButton(self)
self.b1.setText("S1")
self.b1.clicked.connect(lambda: self.conntoS(self.s1))
def conntoS(self, addrs):
self.ClientSocket.connect((addrs[0], addrs[1]))
while True:
time.sleep(1)
self.ClientSocket.send(str.encode("Anything"))
Response = self.ClientSocket.recv(1024)
self.upd(Response.decode('utf-8'))
@QtCore.pyqtSlot()
def upd(self, txt):
self.updateText.emit(txt)
def window():
app = QApplication(sys.argv)
win = MyClient()
win.show()
sys.exit(app.exec_())
window()
uj5u.com熱心網友回復:
您不應該while True使用內部 gui 執行緒運行回圈time.sleep(),因為它會凍結事件回圈:當它運行時,小部件沒有機會接收任何事件,也沒有機會處理它們 - 沒有重繪,沒有信號可以發出,沒有處理程式呼叫。所有長操作都應該在 gui 執行緒之外執行。
您需要創建作業者,將您的阻塞功能移至它并單獨運行它QThread,或者在您的情況下,您可以使用QTcpSocket異步信號槽 api。
在 PyQt 中使用 QThread 的正確方法示例?
Python QTcpSocket 和 QTcpServer 接收訊息
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/456497.html
