简体   繁体   English

如何在 pyqt5 中的 textedit 上从服务器更新文本?

[英]How to Update the text from server on textedit in pyqt5?

I am creating a chat application in which I am using one thread two run app and another to run the server.我正在创建一个聊天应用程序,其中我使用一个线程两个运行应用程序和另一个运行服务器。 But I am unable to update the text on the textedit whenever I get the message on my server.但是每当我在服务器上收到消息时,我都无法更新 textedit 上的文本。 I have tried several ways but none of them work.我尝试了几种方法,但都没有奏效。 Any Idea how can i update my textedit.任何想法我如何更新我的文本编辑。 Here is the code of my chatpage window-这是我的聊天页面窗口的代码-

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() 

And this is the code to run the app and the server-这是运行应用程序和服务器的代码-

thread1 = threading.Thread(target=Run_App)
thread2 = threading.Thread(target=Run_Server)
thread1.start()
thread2.start()  

This is the output Get-这是 output 获取- 图片

Please see whatever I send is sent to my server an displayed in the terminal but I want the message to be shown on the text.请查看我发送的任何内容都发送到我的服务器并显示在终端中,但我希望消息显示在文本中。 Not on the terminal.不在终端上。 So please suggest any way.所以请提出任何方法。 And please dont mark this answer duplicate as i am not able to find any solution and if u think answer is already there please send me the answer also.请不要将此答案标记为重复,因为我无法找到任何解决方案,如果您认为答案已经存在,请也将答案发送给我。 Please help me I have been searching for weeks for this answer.请帮助我,我已经为这个答案寻找了几个星期。 Thanks for the help.谢谢您的帮助。

Usually, the server is started in another process than the GUI , not just another thread .通常,服务器在GUI之外的另一个进程中启动,而不仅仅是另一个线程 But if it was you want, it is fine.但如果是你想要的,那很好。 it has nothing to do with your problem.它与你的问题无关。

You already send the message to the server thread: the self.send.clicked.connect(self.send_message) will make the function send_message be called each time the Send button is clicked.您已经将消息发送到服务器线程: self.send.clicked.connect(self.send_message)将使 function send_message在每次单击“发送”按钮时被调用。
Exactly the same applies for displaying the message in the textEdit : connect the click to a new function that add the message content to the textEdit.同样适用于在textEdit中显示消息:将点击连接到一个新的 function,它将消息内容添加到 textEdit。

PyQt slot magic: PyQt 插槽魔法:

self.send.clicked.connect(self.send_message)

does not work, but不起作用,但是

self.send.clicked.connect(lambda: self.send_message())

does

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM