# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'chatbox.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import*
import sys, socket
from threading import *
import _thread
def app_version():
msg_box("Application Version", "Test 0.1")
def msg_box(title, data):
w = QWidget()
QMessageBox.information(w, title, data)
def update_list(self, data):
self.listWidget.addItem(data)
print ("\a")
def server_socket(self):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 10420))
s.listen(1)
except socket.error:
msg_box("Socket Error !!",
"Unable To Setup Local Socket. Port In Use")
return
while 1:
conn, addr = s.accept()
incoming_ip = str(addr[0])
current_chat_ip = self.lineEdit.text()
if incoming_ip != current_chat_ip:
conn.close()
else:
data = conn.recv(4096)
update_list(self, data)
conn.close()
s.close()
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.start_server()
MainWindow.setObjectName("MainWindow")
MainWindow.resize(860, 646)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.frame = QtWidgets.QFrame(self.centralwidget)
self.frame.setGeometry(QtCore.QRect(80, 50, 671, 31))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.lineEdit = QtWidgets.QLineEdit(self.frame)
self.lineEdit.setGeometry(QtCore.QRect(70, 0, 331, 22))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(self.frame)
self.label.setGeometry(QtCore.QRect(10, 0, 61, 21))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.frame)
self.label_2.setGeometry(QtCore.QRect(440, 0, 55, 21))
self.label_2.setObjectName("label_2")
self.lineEdit_2 = QtWidgets.QLineEdit(self.frame)
self.lineEdit_2.setGeometry(QtCore.QRect(490, 0, 171, 22))
self.lineEdit_2.setObjectName("lineEdit_2")
self.frame_2 = QtWidgets.QFrame(self.centralwidget)
self.frame_2.setGeometry(QtCore.QRect(80, 90, 401, 411))
self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_2.setObjectName("frame_2")
self.textEdit = QtWidgets.QTextEdit(self.frame_2)
self.textEdit.setGeometry(QtCore.QRect(10, 10, 381, 361))
self.textEdit.setObjectName("textEdit")
self.pushButton_3 = QtWidgets.QPushButton(self.frame_2)
self.pushButton_3.setGeometry(QtCore.QRect(20, 380, 151, 28))
self.pushButton_3.setObjectName("pushButton_3")
#############################################################
# Executes When The Send Message Button Is Clicked
self.pushButton_3.clicked.connect(self.client_send_message)
############################################################
self.pushButton_4 = QtWidgets.QPushButton(self.frame_2)
self.pushButton_4.setGeometry(QtCore.QRect(230, 380, 151, 28))
self.pushButton_4.setObjectName("pushButton_4")
#############################################################
# Executes When The Clear Logs Button Is Clicked
self.pushButton_4.clicked.connect(self.clear_logs)
##############################################################
self.frame_3 = QtWidgets.QFrame(self.centralwidget)
self.frame_3.setGeometry(QtCore.QRect(490, 80, 261, 421))
self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_3.setObjectName("frame_3")
self.listWidget = QtWidgets.QListWidget(self.frame_3)
self.listWidget.setGeometry(QtCore.QRect(10, 10, 241, 401))
self.listWidget.setObjectName("listWidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 860, 26))
self.menubar.setObjectName("menubar")
self.menuMenu_Action = QtWidgets.QMenu(self.menubar)
self.menuMenu_Action.setObjectName("menuMenu_Action")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actionVersion = QtWidgets.QAction(MainWindow)
self.actionVersion.setObjectName("actionVersion")
#######################################################
# Executes When The SubMenu Item Version Is Clicked
self.actionVersion.triggered.connect(app_version)
#######################################################
self.actionExit = QtWidgets.QAction(MainWindow)
self.actionExit.setObjectName("actionExit")
#######################################################
# Executes When The SubMenu Item Exit Is Clicked
self.actionExit.triggered.connect(qApp.quit)
#######################################################
self.menuMenu_Action.addAction(self.actionVersion)
self.menuMenu_Action.addAction(self.actionExit)
self.menubar.addAction(self.menuMenu_Action.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def clear_logs(self):
self.listWidget.clear()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "IP address"))
self.label_2.setText(_translate("MainWindow", "Name"))
self.pushButton_3.setText(_translate("MainWindow", "Send"))
self.pushButton_4.setText(_translate("MainWindow", "Clear logs"))
self.menuMenu_Action.setTitle(_translate("MainWindow", "Menu Action"))
self.actionVersion.setText(_translate("MainWindow", "Version"))
self.actionExit.setText(_translate("MainWindow", "Exit"))
def start_server(self):
Thread(target=server_socket, args=(self,)).start()
msg_box("Success", "Server Started Sucessfully")
def client_send_message(self):
ip_address = self.lineEdit.text()
nick = self.lineEdit_2.text()
nick = nick.replace("#>","")
rmessage = self.textEdit.toPlainText()
rmessage = rmessage.replace("#>","")
rmsg = nick + " #> " + rmessage
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
c.connect((ip_address, 10420))
except Exception:
msg_box("Connection Refused", "The Address You Are Trying To Reach Is Currently Unavailable")
return
try:
c.send(rmsg)
self.listWidget.addItem(rmsg)
self.textEdit.setText("")
except Exception:
msg_box("Connection Refused", "The Message Cannot Be Sent. End-Point Not Connected !!")
c.close()
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_())
并得到错误
Exception in thread Thread-1: Traceback (most recent call last):
File "D:\Program Files\python 3.7\lib\threading.py", line 917, in_bootstrap_inner
self.run()
File "D:\Program Files\python 3.7\lib\threading.py", line 865, in run
self._target(*self._args, **self._kwargs)
File "chatbox.py", line 47, in server_socket
update_list(self, data)
File "chatbox.py", line 24, in update_list
self.listWidget.addItem(data)
TypeError: arguments did not match any overloaded call:
addItem(self, QListWidgetItem): argument 1 has unexpected type 'bytes'
addItem(self, str): argument 1 has unexpected type 'bytes'
我只是开始编写代码,所以如果有误,请原谅
答案 0 :(得分:0)
通过recv()
接收的是字节,但是QListWidget
需要字符串,因此解决方案是使用decode()
进行转换。
但是您的代码还有另一个隐藏的错误(在我看来,该教程的作者对GUI知之甚少,因此我建议您查找其他教程),无法从另一个线程更新该GUI,这是Qt禁止的,因此解决方案是使用信号,或者在这种情况下将@pyqtSlot()
与QMetaObject::invokeMethod()
一起使用。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'chatbox.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore,QtGui,QtWidgets
import sys
import socket
import threading
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(860, 646)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.frame = QtWidgets.QFrame(self.centralwidget)
self.frame.setGeometry(QtCore.QRect(80, 50, 671, 31))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.lineEdit = QtWidgets.QLineEdit(self.frame)
self.lineEdit.setGeometry(QtCore.QRect(70, 0, 331, 22))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(self.frame)
self.label.setGeometry(QtCore.QRect(10, 0, 61, 21))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.frame)
self.label_2.setGeometry(QtCore.QRect(440, 0, 55, 21))
self.label_2.setObjectName("label_2")
self.lineEdit_2 = QtWidgets.QLineEdit(self.frame)
self.lineEdit_2.setGeometry(QtCore.QRect(490, 0, 171, 22))
self.lineEdit_2.setObjectName("lineEdit_2")
self.frame_2 = QtWidgets.QFrame(self.centralwidget)
self.frame_2.setGeometry(QtCore.QRect(80, 90, 401, 411))
self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_2.setObjectName("frame_2")
self.textEdit = QtWidgets.QTextEdit(self.frame_2)
self.textEdit.setGeometry(QtCore.QRect(10, 10, 381, 361))
self.textEdit.setObjectName("textEdit")
self.pushButton_3 = QtWidgets.QPushButton(self.frame_2)
self.pushButton_3.setGeometry(QtCore.QRect(20, 380, 151, 28))
self.pushButton_3.setObjectName("pushButton_3")
#############################################################
# Executes When The Send Message Button Is Clicked
self.pushButton_3.clicked.connect(self.client_send_message)
############################################################
self.pushButton_4 = QtWidgets.QPushButton(self.frame_2)
self.pushButton_4.setGeometry(QtCore.QRect(230, 380, 151, 28))
self.pushButton_4.setObjectName("pushButton_4")
#############################################################
# Executes When The Clear Logs Button Is Clicked
self.pushButton_4.clicked.connect(self.clear_logs)
##############################################################
self.frame_3 = QtWidgets.QFrame(self.centralwidget)
self.frame_3.setGeometry(QtCore.QRect(490, 80, 261, 421))
self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_3.setObjectName("frame_3")
self.listWidget = QtWidgets.QListWidget(self.frame_3)
self.listWidget.setGeometry(QtCore.QRect(10, 10, 241, 401))
self.listWidget.setObjectName("listWidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 860, 26))
self.menubar.setObjectName("menubar")
self.menuMenu_Action = QtWidgets.QMenu(self.menubar)
self.menuMenu_Action.setObjectName("menuMenu_Action")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actionVersion = QtWidgets.QAction(MainWindow)
self.actionVersion.setObjectName("actionVersion")
self.actionExit = QtWidgets.QAction(MainWindow)
self.actionExit.setObjectName("actionExit")
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "IP address"))
self.label_2.setText(_translate("MainWindow", "Name"))
self.pushButton_3.setText(_translate("MainWindow", "Send"))
self.pushButton_4.setText(_translate("MainWindow", "Clear logs"))
self.menuMenu_Action.setTitle(_translate("MainWindow", "Menu Action"))
self.actionVersion.setText(_translate("MainWindow", "Version"))
self.actionExit.setText(_translate("MainWindow", "Exit"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
#######################################################
# Executes When The SubMenu Item Version Is Clicked
self.actionVersion.triggered.connect(self.app_version)
#######################################################
#######################################################
# Executes When The SubMenu Item Exit Is Clicked
self.actionExit.triggered.connect(QtWidgets.qApp.quit)
#######################################################
self.menuMenu_Action.addAction(self.actionVersion)
self.menuMenu_Action.addAction(self.actionExit)
self.menubar.addAction(self.menuMenu_Action.menuAction())
self.start_server()
def clear_logs(self):
self.listWidget.clear()
def start_server(self):
threading.Thread(target=server_socket, args=(self,)).start()
self.msg_box("Success", "Server Started Sucessfully")
def client_send_message(self):
ip_address = self.lineEdit.text()
nick = self.lineEdit_2.text()
nick = nick.replace("#>","")
rmessage = self.textEdit.toPlainText()
rmessage = rmessage.replace("#>","")
rmsg = nick + " #> " + rmessage
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
c.connect((ip_address, 10420))
except Exception:
self.msg_box("Connection Refused", "The Address You Are Trying To Reach Is Currently Unavailable")
return
try:
c.send(rmsg.encode())
self.listWidget.addItem(rmsg)
self.textEdit.clear()
except Exception:
self.msg_box("Connection Refused", "The Message Cannot Be Sent. End-Point Not Connected !!")
c.close()
def app_version(self):
self.msg_box("Application Version", "Test 0.1")
@QtCore.pyqtSlot(str, str)
def msg_box(self, title, data):
QtWidgets.QMessageBox.information(None, title, data)
@QtCore.pyqtSlot(str)
def update_list(self, data):
self.listWidget.addItem(data)
print("\a")
def server_socket(self):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 10420))
s.listen(1)
except socket.error:
QtCore.QMetaObject.invokeMethod(self, "msg_box", QtCore.Qt.QueuedConnection, QtCore.Q_ARG(str, "Socket Error !!"),
QtCore.Q_ARG(str, "Unable To Setup Local Socket. Port In Use"))
return
while True:
conn, addr = s.accept()
incoming_ip = str(addr[0])
current_chat_ip = self.lineEdit.text()
if incoming_ip != current_chat_ip:
conn.close()
else:
data = conn.recv(4096).decode()
QtCore.QMetaObject.invokeMethod(self, "update_list", QtCore.Qt.QueuedConnection, QtCore.Q_ARG(str,data))
conn.close()
s.close()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
另一方面,我建议使用QTcpSocket,因为不需要使用线程,在此link中,您可以找到几个示例。