Python聊天应用程序(套接字和Qt)

2024-10-17 08:23:17 发布

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

我正试图用Python&;编写一个聊天应用程序;Qt

由于my receivemessage功能(似乎被阻止),图形聊天应用程序无法显示

如果我取消对receivemessage函数的链接的注释,它确实会显示出来

这是我到目前为止写的:

服务器:

#/usr/bin/python3.7
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QLabel, QPushButton, QLineEdit, QTextEdit, QAction, QMessageBox
from PySide2.QtGui import QIcon
import socket
import sys
class Window (QMainWindow):
    def __init__(self):
        super().__init__()
        self.servername = "Linux"
        self.host = "192.168.0.144"
        self.port = 27500
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.setWindowTitle("PYTHON CHATSERVER")
        self.setGeometry(850, 850, 900, 750)
        self.connection()
        self.setIcon()
        self.createmenu()
        self.initUi()
    def connection (self):
        try:
            self.s.bind((self.host, self.port))
            QMessageBox.warning(self, "Bind", "Bind working")
        except socket.error as msg:
            print("Error")
        print("Server launched...")
        self.s.listen(10)
        self.conn, self.adr = self.s.accept()
        self.clientname = self.conn.recv(200).decode()
        self.conn.send(self.servername.encode())
        print("Clientnaam: ", self.clientname)
    def setIcon (self):
        icon = QIcon("icon.png")
        self.setWindowIcon(icon)
    def createmenu (self):
        mainmenu = self.menuBar()
        filemenu = mainmenu.addMenu("File")
        exitaction = QAction(QIcon("icon.png"), "Exit", self)
        exitaction.triggered.connect(self.leave)
        filemenu.addAction(exitaction)
    def initUi (self):
        mainwidget = QWidget(self)
        self.setCentralWidget(mainwidget)
        gridlayout = QGridLayout()
        mainwidget.setLayout(gridlayout)
        self.labelchat = QLabel("Chat", mainwidget)
        self.participants = QLabel("Participants", mainwidget)
        self.chatbox = QTextEdit(mainwidget)
        self.participantsfield = QTextEdit(mainwidget)
        self.message = QLabel("Message: ", mainwidget)
        self.messagefield = QLineEdit(mainwidget)
        self.Button = QPushButton("Send Message", mainwidget)
        self.Button.clicked.connect(self.sendmessage)
        gridlayout.addWidget(self.labelchat, 0, 0)
        gridlayout.addWidget(self.participants, 0, 1)
        gridlayout.addWidget(self.chatbox, 2, 0)
        gridlayout.addWidget(self.participantsfield, 2, 1)
        gridlayout.addWidget(self.message, 3, 0)
        gridlayout.addWidget(self.messagefield, 4, 0)
        gridlayout.addWidget(self.Button, 5, 0, 1, 2)
        self.participantsfield.setText(self.clientname + "\n" + self.servername + "\n")
        self.chatbox.append(self.clientname + " connected")
        self.receivemessage()
    def receivemessage (self):
        while True:
            self.messageclient = self.conn.recv(200).decode()
            if self.messageclient:
                self.chatbox.append(self.clientname + "> " + self.messageclient)
    def sendmessage (self):
        self.messageserver = self.messagefield.text()
        self.conn.send(self.messageserver.encode())
        self.chatbox.append(self.servername + ">" + self.messageserver)
    def leave (self):
        myapp.quit()

客户:

#/usr/bin/python3.7
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QLabel, QPushButton, QLineEdit, QTextEdit, QAction, QMessageBox
from PySide2.QtGui import QIcon
import socket
import sys
class Window (QMainWindow):
    def __init__(self):
        super().__init__()
        self.clientname = "Pieterjan"
        self.host = "192.168.0.144"
        self.port = 27500
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.setWindowTitle("Python Chatclient")
        self.setGeometry(850, 850, 900, 750)
        self.setIcon()
        self.createmenu()
        self.connection()
        self.initUi()
    def setIcon (self):
        icon = QIcon("icon.png")
        self.setWindowIcon(icon)
    def createmenu (self):
        mainmenu = self.menuBar()
        filemenu = mainmenu.addMenu("File")
        exitaction = QAction(QIcon("icon.png"), "Exit", self)
        exitaction.triggered.connect(self.leave)
        filemenu.addAction(exitaction)
    def connection (self):
        try:
            self.s.connect((self.host, self.port))
            QMessageBox.warning(self, "Connection", "Connection made")
        except:
            print("Failed to connect with {}:{}" .format(self.host, self.port))
        self.s.send(self.clientname.encode())
        self.servername = self.s.recv(200).decode()
    def initUi (self):
        mainwidget = QWidget(self)
        self.setCentralWidget(mainwidget)
        gridlayout = QGridLayout()
        mainwidget.setLayout(gridlayout)
        self.labelchat = QLabel("Chat", mainwidget)
        self.participants = QLabel("Participants", mainwidget)
        self.chatbox = QTextEdit(mainwidget)
        self.participantsfield = QTextEdit(mainwidget)
        self.message = QLabel("Message: ", mainwidget)
        self.messagefield = QLineEdit(mainwidget)
        self.Button = QPushButton("Send Message", mainwidget)
        self.Button.clicked.connect(self.sendmessage)
        gridlayout.addWidget(self.labelchat, 0, 0)
        gridlayout.addWidget(self.participants, 0, 1)
        gridlayout.addWidget(self.chatbox, 2, 0)
        gridlayout.addWidget(self.participantsfield, 2, 1)
        gridlayout.addWidget(self.message, 3, 0)
        gridlayout.addWidget(self.messagefield, 4, 0)
        gridlayout.addWidget(self.Button, 5, 0, 1, 2)
        self.participantsfield.setPlainText(self.clientname + "\n" + self.servername)
        self.chatbox.append("Connected with: " + self.servername)
        self.receivemessage()
    def receivemessage (self):
        while True:
            self.messageserver = self.s.recv(200).decode()
            if self.messageserver:
                self.chatbox.append(self.servername+ "> " + self.messageserver)
    def sendmessage (self):
        self.messageclient = self.messagefield.text()
        self.s.send(self.messageclient.encode())
        self.chatbox.append(self.clientname + ">" + self.messageclient)
    def leave (self):
        myapp.quit()
myapp = QApplication(sys.argv)
window = Window()
window.show()
myapp.exec_()
sys.exit(0)

有人能帮我吗? 提前谢谢


Tags: importselfdefsocketiconservernameclientnameaddwidget
1条回答
网友
1楼 · 发布于 2024-10-17 08:23:17

我认为线程技术提供了解决方案

我在服务器和客户端文件中都添加了下一个代码:

t1 = threading.Thread(target = self.receivemessage)
    t1.daemon = True
    t1.start()

现在它似乎起作用了

相关问题 更多 >