Обновите окна графического интерфейса

У меня есть проект от клиента (C ++) до сервера (Python).

Клиент отправил сообщение на сервер, и каждое сообщение содержит три атрибута.

Графический интерфейс должен отображать все атрибуты на экране. Когда клиент отправил первое сообщение, все работает. Но когда он отправил следующее сообщение, мне нужно закрыть окно, и когда я это сделаю, он откроет новое окно и покажет следующее сообщение, если я этого не сделаю, он не покажет новые полученные сообщения.

Я подозреваю, что app.exec_() мешает программе получать новое сообщение типа в этот случай, но я не уверен. мой вопрос:

  1. Так ли это на самом деле? И если да, то где я должен разместить нить?

  2. Я никогда раньше не использовал QThread, и я видел, что мы выполняем Override для Run(), а в метод Run() мы вложили всю логику, какую логику я должен вложить в мою конкретную проблему. вы можете найти полный проект здесь

Соответствующий код:

def recive(self):

        global income
        global table2

        msg = Payload(0, 0, 0)

        while (True):

            print('waiting for a connection..')
            conn, addr = self.My_socket.accept()
            print("connection has been established | " + repr(addr))
            logger.info("connection has been established | " + repr(addr))

            while conn:
                myThread = MyThread()

                buff = conn.recv(sizeof(msg))

                print("recv %d bytes" % sizeof(msg))
                payload_in = Payload.from_buffer_copy(buff)

                print(f"Received id={payload_in.id}, counter={payload_in.counter}, opcode={payload_in.opcode}")

                payload_out = payload_in

                self.opcode = payload_in.opcode

                if self.opcode == 1:
                    self.export()
                elif self.opcode == 2:
                    payload_out.counter += 1
                else:
                    logger.info("Unexpected opcode %d" % self.opcode)

                nsent = conn.send(payload_out)
                print("send %d bytes" % nsent)
                print("send id=%d, counter=%d, opcode=%d" % (payload_out.id,
                                                             payload_out.counter,
                                                             payload_out.opcode))
                self.setNewTable(payload_in, payload_out)

        print("Closing connection to client")
        print("----------------------------")

        sys.exit()

    def setNewTable(self,payload_in, payload_out):
            self.insertValues(table1, payload_in)
            self.insertValues(table2, payload_out)
            ex.show()
            app.exec_()

    def insertValues(self,table, payload):
            table.setItem(0, 1, QTableWidgetItem(str(payload.id)))
            table.setItem(1, 1, QTableWidgetItem(str(payload.counter)))
            table.setItem(2, 1, QTableWidgetItem(str(payload.opcode)))

person TheTwo    schedule 22.07.2019    source источник
comment
Хорошо, при кратком обзоре я вижу множество проблем, которые могут вызывать у вас проблемы. Мой первый и самый сильный совет - вам нужно классифицировать все эти функции, потому что я не думаю, что они работают так, как вы могли бы подумать, что они работают. Я посмотрю на это в свободное время и посмотрю, смогу ли я исправить различные проблемы, которые я вижу с ним, но если вы пройдете и классифицируете его, просто опубликуйте новый код (если он все еще не работает), и это может ускорить процесс.   -  person Dennis Jensen    schedule 22.07.2019
comment
Деннис Дженсен, я добавляю новую версию, стараюсь изо всех сил. Я впервые сталкиваюсь с ООП на Python. Полный код по ссылке выше.   -  person TheTwo    schedule 22.07.2019
comment
Хорошо, у меня есть обновление, и пока я буду - на другом форуме - публиковать результаты по частям, пока я иду, этому форуму это не нравится - поэтому, как только я получу доработку, я опубликую полный ответ - пока что проведена реструктуризация графического интерфейса - работа с сокетами и потоками - что, кстати, интересует меня, так как это то, что мне нужно будет сделать в ближайшее время самому   -  person Dennis Jensen    schedule 22.07.2019
comment
Спасибо за попытку   -  person TheTwo    schedule 25.07.2019
comment
Ссылка на github, где должен быть предполагаемый server.py, там не найдена. Следовательно, публиковать ответы на другом форуме без ссылки и вставлять основы ответа вообще не имеет смысла. Кроме того, вопрос слишком широкий, и здесь есть много примеров по SO и в справочном руководстве самого QT. Голосование за снятие вопроса. (Из обзора).   -  person ZF007    schedule 14.09.2019


Ответы (1)


Я знаю несколько вещей о QThread ui, думаю, вам нужно использовать сигнал и слот python для обновления ui. см. следующий код

from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import datetime
import sys
import struct
import threading
import os
import datetime
import time
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)
class MySignal(QObject):
        signelforWritemsg=Signal(str)
class EchoThread(QThread):
    #def __init__(self,Inf_found1,inf_cleaned1,Auto_clean,timer,movie,Scan_btn,cancel_btn,status_text):
    def __init__(self,parent = None):
        QThread.__init__(self,parent)
        self.exiting = False
        self.signal = MySignal()

    def run(self):
        while True:
            scantimenow= datetime.datetime.now()
            scantime=scantimenow.strftime('%Y-%m-%d %H:%M:%S')
            print(scantime)
            self.signal.signelforWritemsg.emit(scantime)
            time.sleep(5)
class Ui_Clientserver(object):
    def setupUi(self, Clientserver):
        Clientserver.setObjectName(_fromUtf8("Clientserver"))
        Clientserver.resize(400, 300)
        self.label = QtGui.QLabel(Clientserver)
        self.label.setGeometry(QtCore.QRect(150, 70, 200, 200))
        self.label.setObjectName(_fromUtf8("label"))
        self.retranslateUi(Clientserver)

        self.thread = EchoThread()
        self.thread.start()
        self.thread.signal.signelforWritemsg.connect(self.signelforWritemsg)

    def signelforWritemsg(self,data):
        self.label.setText(_translate("Clientserver",str(data), None))
    def retranslateUi(self, Clientserver):
        Clientserver.setWindowTitle(_translate("Clientserver", "Clientserver", None))

        self.label.setText(_translate("Clientserver", "inProgess", None))
if __name__ == "__main__":
    import sys
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_X11InitThreads)
    app = QtGui.QApplication(sys.argv)
    Clientserver = QtGui.QWidget()
    ui = Ui_Clientserver()
    ui.setupUi(Clientserver)
    Clientserver.show()
    sys.exit(app.exec_())
person sagar bade    schedule 14.09.2019
comment
Вопрос OP далек от завершения, и server.py отсутствует. Вот почему здесь никто не отвечает. Основное, что вы разместили здесь, можно найти в многочисленных примерах здесь, на SO. Отсутствие server.py и все еще публикация примера ... вероятно, напрасны из-за слишком широкого вопроса. (Из обзора). - person ZF007; 14.09.2019