簡體   English   中英

如何在 pyqt5 中的 textedit 上從服務器更新文本?

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

我正在創建一個聊天應用程序,其中我使用一個線程兩個運行應用程序和另一個運行服務器。 但是每當我在服務器上收到消息時,我都無法更新 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()  

這是 output 獲取- 圖片

請查看我發送的任何內容都發送到我的服務器並顯示在終端中,但我希望消息顯示在文本中。 不在終端上。 所以請提出任何方法。 請不要將此答案標記為重復,因為我無法找到任何解決方案,如果您認為答案已經存在,請也將答案發送給我。 請幫助我,我已經為這個答案尋找了幾個星期。 謝謝您的幫助。

通常,服務器在GUI之外的另一個進程中啟動,而不僅僅是另一個線程 但如果是你想要的,那很好。 它與你的問題無關。

您已經將消息發送到服務器線程: self.send.clicked.connect(self.send_message)將使 function send_message在每次單擊“發送”按鈕時被調用。
同樣適用於在textEdit中顯示消息:將點擊連接到一個新的 function,它將消息內容添加到 textEdit。

PyQt 插槽魔法:

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

不起作用,但是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM