python - 如何在pyqt5中的textedit上更新服务器上的文本?
问题描述
我正在创建一个聊天应用程序,其中我使用一个线程两个运行应用程序和另一个运行服务器。但是每当我在服务器上收到消息时,我都无法更新 textedit 上的文本。我尝试了几种方法,但都没有奏效。任何想法我如何更新我的文本编辑。这是我的聊天页面窗口的代码-
class ChatPage(object):
def __init__(self,MainWindow):
MainWindow.setObjectName("MainWindow")
self.window2 = MainWindow
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox.setGeometry(QtCore.QRect(10, 430, 780, 121))
self.groupBox.setTitle("")
self.groupBox.setObjectName("groupBox")
self.textEdit = QtWidgets.QTextEdit(self.groupBox)
self.textEdit.setGeometry(QtCore.QRect(10, 50, 651, 60))
font = QtGui.QFont()
font.setPointSize(25)
self.textEdit.setFont(font)
self.textEdit.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.IBeamCursor))
self.textEdit.setStyleSheet("background-color: normal;")
self.textEdit.setFrameShadow(QtWidgets.QFrame.Raised)
self.textEdit.setObjectName("textEdit")
self.send = QtWidgets.QPushButton(self.groupBox)
self.send.setGeometry(QtCore.QRect(670, 50, 101, 61))
font = QtGui.QFont()
font.setPointSize(60)
self.send.setFont(font)
self.send.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.send.setStyleSheet("background-color: orange;\n"
"")
self.send.setObjectName("send")
self.bold = QtWidgets.QPushButton(self.groupBox)
self.bold.setGeometry(QtCore.QRect(10, 10, 60, 30))
font = QtGui.QFont()
font.setPointSize(15)
font.setBold(True)
font.setWeight(75)
self.bold.setFont(font)
self.bold.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.bold.setCheckable(True)
self.bold.setObjectName("bold")
self.italic = QtWidgets.QPushButton(self.groupBox)
self.italic.setGeometry(QtCore.QRect(80, 10, 60, 30))
font = QtGui.QFont()
font.setPointSize(15)
font.setItalic(True)
self.italic.setFont(font)
self.italic.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.italic.setCheckable(True)
self.italic.setObjectName("italic")
self.underline = QtWidgets.QPushButton(self.groupBox)
self.underline.setGeometry(QtCore.QRect(150, 10, 60, 30))
font = QtGui.QFont()
font.setPointSize(15)
font.setUnderline(True)
self.underline.setFont(font)
self.underline.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.underline.setCheckable(True)
self.underline.setObjectName("underline")
self.strikeout = QtWidgets.QPushButton(self.groupBox)
self.strikeout.setGeometry(QtCore.QRect(220, 10, 60, 30))
font = QtGui.QFont()
font.setPointSize(15)
font.setStrikeOut(True)
self.strikeout.setFont(font)
self.strikeout.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.strikeout.setCheckable(True)
self.strikeout.setObjectName("strikeout")
self.clear = QtWidgets.QPushButton(self.groupBox)
self.clear.setGeometry(QtCore.QRect(290, 10, 60, 30))
font = QtGui.QFont()
font.setPointSize(15)
self.clear.setFont(font)
self.clear.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.clear.setObjectName("strikeout")
self.emoji = QtWidgets.QPushButton(self.groupBox)
self.emoji.setGeometry(QtCore.QRect(720, 10, 50, 31))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)
self.emoji.setFont(font)
self.emoji.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.emoji.setObjectName("emoji")
self.rm = QtWidgets.QPushButton(self.groupBox)
self.rm.setGeometry(QtCore.QRect(360, 10, 60, 31))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(False)
font.setWeight(50)
self.rm.setFont(font)
self.rm.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.rm.setObjectName("rm")
self.textEdit2 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit2.setGeometry(QtCore.QRect(10, 59, 780, 361))
font = QtGui.QFont()
font.setPointSize(28)
self.textEdit2.setFont(font)
self.textEdit2.setStyleSheet("background-color: transparent;")
self.textEdit2.setFrameShadow(QtWidgets.QFrame.Plain)
self.textEdit2.setReadOnly(True)
self.textEdit2.setObjectName("textEdit2")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(10, 0, 790, 61))
font = QtGui.QFont()
font.setPointSize(36)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
self.menuBack = QtWidgets.QMenu(self.menubar)
self.menuBack.setObjectName("menuBack")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actionHome = QtWidgets.QAction(MainWindow)
self.actionHome.setObjectName("actionHome")
self.actionHelp = QtWidgets.QAction(MainWindow)
self.actionHelp.setObjectName("actionHelp")
self.actionShortcut = QtWidgets.QAction(MainWindow)
self.actionShortcut.setObjectName("actionShortcut")
self.menuBack.addAction(self.actionHome)
self.menuBack.addAction(self.actionShortcut)
self.menubar.addAction(self.menuBack.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "ChatPage"))
self.textEdit.setPlaceholderText(_translate("MainWindow", "Type Here..."))
self.send.setStatusTip(_translate("MainWindow", "Send.."))
self.send.setText(_translate("MainWindow", "▶"))
self.bold.setStatusTip(_translate("MainWindow", "Bold..."))
self.bold.setText(_translate("MainWindow", "B"))
self.bold.setShortcut(_translate("MainWindow", "Ctrl+B"))
self.italic.setStatusTip(_translate("MainWindow", "Italic..."))
self.italic.setText(_translate("MainWindow", "I"))
self.italic.setShortcut(_translate("MainWindow", "Ctrl+I"))
self.underline.setStatusTip(_translate("MainWindow", "Underlined..."))
self.underline.setText(_translate("MainWindow", "U"))
self.underline.setShortcut(_translate("MainWindow", "Ctrl+U"))
self.strikeout.setStatusTip(_translate("MainWindow", "Strikeout..."))
self.strikeout.setText(_translate("MainWindow", "abc"))
self.rm.setText(_translate("MainWindow", "Receive"))
self.clear.setText(_translate("MainWindow", "Clear"))
self.strikeout.setShortcut(_translate("MainWindow", "Ctrl+T"))
self.emoji.setStatusTip(_translate("MainWindow", "Emoji..."))
self.emoji.setText(_translate("MainWindow", ""))
with open('c1_id.txt','r') as file:
text = file.read()
self.label.setText(_translate("MainWindow", text))
self.menuBack.setTitle(_translate("MainWindow", "Back"))
self.actionHome.setText(_translate("MainWindow", "Home"))
self.actionHome.setShortcut(_translate("MainWindow", "Ctrl+H"))
self.send.setShortcut(_translate("MainWindow", "Ctrl+Return"))
self.actionHelp.setText(_translate("MainWindow", "Help"))
self.actionShortcut.setText(_translate("MainWindow", "Shortcuts"))
# Functionality
self.send.clicked.connect(self.send_message)
self.rm.clicked.connect(self.add_text)
self.clear.clicked.connect(self.clear_text)
self.actionHome.triggered.connect(lambda: self.switch_to_contacts())
def send_message(self):
text = self.textEdit.toPlainText()
if text != '':
textbox = self.textEdit2.toPlainText()
send(text)
self.textEdit.clear()
self.textEdit2.setText(f"{textbox}You: {text}\n")
def add_text(self):
with open('c1_id.txt','r') as file:
text = file.read()
self.textEdit2.setText(self.textEdit2.toPlainText()+text+': '+messages+'\n')
def clear_text(self):
self.textEdit2.clear()
这是运行应用程序和服务器的代码-
thread1 = threading.Thread(target=Run_App)
thread2 = threading.Thread(target=Run_Server)
thread1.start()
thread2.start()
请查看我发送的任何内容都发送到我的服务器并显示在终端中,但我希望消息显示在文本上。不在终端上。所以请提出任何方法。请不要将此答案标记为重复,因为我无法找到任何解决方案,如果您认为答案已经存在,请也将答案发送给我。 请帮助我,我已经为这个答案寻找了几个星期。谢谢您的帮助。
解决方案
通常,服务器在GUI之外的另一个进程中启动,而不仅仅是另一个线程。但如果是你想要的,那很好。它与你的问题无关。
您已经将消息发送到服务器线程:每次单击“发送”按钮时都会调用self.send.clicked.connect(self.send_message)
该函数。
在 中显示消息完全相同:将单击连接到将消息内容添加到 textEdit 的新函数。send_message
textEdit
推荐阅读
- javascript - 反应:node_modules 文件中的更改不反映 UI 中的更改
- sql - 查找最新更新日期的竞争对手价格
- javascript - 如何在不使用 JavaScript 重新加载页面的情况下在 DB 中执行操作?
- ruby-on-rails - 如何使表单文本字段在 Ruby on Rails 中接受 $ 符号和逗号?
- maven - mvn打包时如何添加依赖jar?
- asp.net - 部署到 IIS 的问题
- javascript - SimpleWebRtc 不工作:窗口未定义
- r - 显示模态onclick plotly条形图
- sql - 数据透视表出错:必须声明标量变量@start1
- javascript - 如何在ckeditor5中添加自定义类和样式