为什么我的pyqt5不能用明文?

2024-06-16 13:04:57 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的初始代码。我希望它在纯文本框中打印所需的文本,但它没有。我尝试过在没有任何套接字编程的情况下运行代码,它确实有效,但当我添加套接字时,程序只是说没有响应。出现错误的行为粗体(****)。非常感谢你的帮助

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QInputDialog
from socket import *
import socket
from threading import Thread

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.MainWindow = MainWindow.setObjectName("MainWindow")
        MainWindow.resize(251, 335)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.BigBox = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.BigBox.setGeometry(QtCore.QRect(10, 10, 231, 211))
        self.BigBox.setObjectName("BigBox")
        self.BigBox.setPlainText("")

        self.SmallBox = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.SmallBox.setGeometry(QtCore.QRect(10, 230, 231, 31))
        self.SmallBox.setObjectName("SmallBox")
        self.SmallBox.setPlainText("")

        self.hostButton = QtWidgets.QPushButton(self.centralwidget)
        self.hostButton.setGeometry(QtCore.QRect(90, 270, 75, 23))
        self.hostButton.setObjectName("hostButton")

        self.submitButton = QtWidgets.QPushButton(self.centralwidget)
        self.submitButton.setGeometry(QtCore.QRect(170, 270, 75, 23))
        self.submitButton.setObjectName("submitButton")

        self.connectButton = QtWidgets.QPushButton(self.centralwidget)
        self.connectButton.setGeometry(QtCore.QRect(10, 270, 75, 23))
        self.connectButton.setObjectName("connectButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.hostButton.clicked.connect(self.popForHost)
        self.connectButton.clicked.connect(self.popForConnect)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Chat Room"))
        self.hostButton.setText(_translate("MainWindow", "Host"))
        self.submitButton.setText(_translate("MainWindow", "Submit"))
        self.connectButton.setText(_translate("MainWindow", "Connect"))

    def popForHost(self):
        self.port ,y = QInputDialog.getText(self.MainWindow, "Host Options", "Enter The Port: ")
        if y == True:
            self.serverForHost()

    def popForConnect(self):
        self.IP ,y = QInputDialog.getText(self.MainWindow, "Connect Options", "Enter The IP: ")
        self.port2 ,b = QInputDialog.getText(self.MainWindow, "Connect Options", "Enter The Port: ")
        if y == True and b == True:
            self.serverForConnect()

    def serverForHost(self):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        self.IPAddr = socket.gethostbyname(socket.gethostname())

        self.s.bind(('', int(self.port)))
        ** self.BigBox.appendPlainText("Hello") **
        self.s.listen(1) #Max of one connection
        self.conn,self.addr = self.s.accept() #Accept conn
        print("[+] Connected: "+str(self.addr[0])+ ' Port: '+str(self.addr[1]))
        print(self.conn.recv(1024).decode("UTF-8"))
        
        t1 = Thread(target=self.hostThread)
        t1.start()

    def serverForConnect(self):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        self.IPAddr = socket.gethostbyname(socket.gethostname())

        self.s.connect((self.IP, int(self.port2)))
        self.s.send(str.encode("[+] Connection Established"))

        t2 = Thread(target=self.connectThread)
        t2.start()
        
    def hostThread(self):
        while 1:
            command = input("["+str(self.IPAddr)+']: ')
            self.conn.send(bytes(command, 'UTF-8'))
            data = self.conn.recv(1024).decode()
            print("["+str(self.addr[0])+"]: " +data)

    def connectThread(self):
        while 1:
            data = self.s.recv(1024).decode("UTF-8")
            print("["+str(self.IP)+"]: "+data)
            command = input("["+str(self.IPAddr)+"]: ")
            self.s.send(bytes(command, "UTF-8"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Tags: importselfdefsockettranslatestrqtcoreqtwidgets
1条回答
网友
1楼 · 发布于 2024-06-16 13:04:57

设置更改时,但在执行函数中的所有代码后,所有GUI不会直接更新/读取小部件。通过这种方式,它可以在一瞬间重新绘制所有更改(而不是为许多更改多次重新绘制窗口小部件),这样GUI就不会闪烁太多

但您的函数使用accept()等待连接,所以它不会结束函数,GUI也不能重新绘制小部件

使用repaint()可以强制GUI立即重新绘制小部件

    self.BigBox.appendPlainText("Hello")
    self.BigBox.repaint()

相关问题 更多 >