【发布时间】:2018-10-29 00:45:11
【问题描述】:
我正在尝试创建一个聊天室程序作为一个休闲项目,以更好地理解 PyQt5 和多线程,但我面临着相当奇怪的问题。在 sWindow 类中,在 createserver() 函数中,setText() try 块中的显示小部件中的 em> 冻结屏幕,但后台进程工作正常。 except 块中的 setText 函数工作正常。如果我尝试将语句打印到 cmd,它会完美运行。
这是我遇到问题的代码sn-p:
def createServer(self):
try:
self.display.setText("Creating server") #doesn't display text, whole screen freezes
print("Creating Server") #works fine
self.s.bind((self.host, self.port))
self.s.listen(10)
print("Server Created") #works fine
self.display.append("Server Created.") #doesn't print anything
self.display.append("Started listening to clients")
self.Listen() #goes into the listen function as well without display widget printing anything
except Exception as e:
print(e)
self.display.setText("Error occured")
这是整个代码:
class sWindow(QMainWindow):
def __init__(self, title = "File Sharing", l = 0, t = 0, r = 800, b = 600):
super().__init__()
self.left = l
self.right = r
self.top = t
self.bottom = b
self.title = title
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.host = ""
self.port = 15478
self.ip_add = socket.gethostbyname(socket.getfqdn())
self.initUi()
self.shutting = False
self.mode = 0
self.address = {}
self.clientaddr = {}
self.buffsize = 2048
self.encoding = 'utf8'
def closeEvent(self, event):
reply = QMessageBox.question(self, "Message Box", "Are you sure?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
self.shutting = True
self.s.close()
event.accept()
else:
event.ignore()
def createServer(self):
try:
self.display.setText("Creating server")
print("Creating Server")
self.s.bind((self.host, self.port))
self.s.listen(10)
print("Server Created")
self.display.append("Server Created.")
self.display.append("Started listening to clients")
self.Listen()
except Exception as e:
print(e)
self.display.setText("Error occured")
def Listen(self):
try:
print("started listenting")
while self.shutting == False:
client, addr = self.s.accept()
self.address[client] = addr
message = "Enter your name: "
client.send(message.encode(encoding))
threading.Thread(target = handleclient, args = (client,)).start()
except Exception as e:
print('Error occured while creating server. ',e)
def handleclient(self, client):
try:
name = client.recv(buffsize).decode(encoding)
self.display.append(name + " connected from address ", addr)
self.clientaddr[client] = name
message = "Welcome " + name + "!! You have entered the chatroom."
client.send(message.encode(encoding))
message = name + "has entered the chatroom. "
self.broadcast(message, client)
while self.shutting == False:
data = client.recv(buffsize).decode(encoding)
self.display.append(name + ': ' + data)
self.broadcast(data, client)
except Exception as e:
del self.address[client]
del self.clientaddr[client]
self.display.append('Error occured while connecting to client. ',e)
message = name + " entered the chatroom."
self.broadcast(message.encode(encoding), False)
return
def broadcast(self, mesage, client):
try:
for sock in self.address.keys():
if sock != client:
sock.send(message)
except Exception as e:
self.display.append("Error occured while broadcasting the message to clients. ", e)
print(e)
return
def centr(self):
qr = self.frameGeometry()
cr = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cr)
self.move(qr.topLeft())
def initUi(self):
## For window
self.setGeometry(self.left, self.top, self.right, self.bottom)
self.centr()
self.setWindowTitle(self.title)
self.setWindowIcon(QIcon("fSharing.jpg"))
## For layout
self.setCentralWidget(QWidget(self))
self.grid = QGridLayout()
self.grid.setSpacing(10)
self.centralWidget().setLayout(self.grid)
#def createServer(self):
def mainWindow(self):
## buttons
global ip
self.connect = QPushButton("Connect")
self.connect.setToolTip("Connect to the server")
self.connect.resize(self.connect.sizeHint())
self.create = QPushButton("Create Server")
self.create.setToolTip("Create server for others to connect")
self.create.resize(self.create.sizeHint())
self.create.clicked.connect(self.createServer)
self.chooseFile = QPushButton("Choose File")
self.chooseFile.setToolTip("Choose the file you want to send.")
self.chooseFile.setEnabled(False)
self.chooseFile.resize(self.chooseFile.sizeHint())
self.send = QPushButton("Send")
self.send.setEnabled(False)
self.send.resize(self.send.sizeHint())
self.sendFile = QPushButton("Send File")
self.sendFile.setToolTip("Send the selected file")
self.sendFile.setEnabled(False)
self.sendFile.resize(self.sendFile.sizeHint())
## text Fields
self.ip = QLineEdit()
self.ip.setPlaceholderText("Ex: 192.168.0.1")
self.display = QTextEdit()
self.display.setReadOnly(True)
self.sendText = QTextEdit()
## Label
self.lbl = QLabel()
self.lbl.setText(" Or ")
self.grid.addWidget(self.create, 0,3 )
self.grid.addWidget(self.lbl, 0,5)
self.grid.addWidget(self.ip, 0,7)
self.grid.addWidget(self.connect,0,9)
self.grid.addWidget(self.display, 1, 1, 8, 7)
self.grid.addWidget(self.chooseFile, 2, 9)
self.grid.addWidget(self.sendFile, 4, 9)
self.grid.addWidget(self.sendText, 9, 1, 2, 7)
self.grid.addWidget(self.send, 9,9)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = sWindow()
win.mainWindow()
sys.exit(app.exec())
【问题讨论】:
标签: python multithreading python-3.x sockets pyqt5