python - 刷新 GUI 窗口
问题描述
我有一个客户端(C++)到服务器(Python)项目。
客户端向服务器发送了一个Message,每个Message包含三个属性。
Gui 应该在屏幕上显示所有属性。当客户端发送第一条消息时,一切正常。但是当他发送下一条消息时,我需要关闭窗口,当我这样做时,它会打开一个新窗口并显示以下消息,如果我不这样做,他不会显示收到的新消息。
我怀疑在这种情况下app.exec_()
阻止程序收到新消息,但我不确定。我的问题是:
真的是这样吗?如果是这样,我应该把线程放在哪里?
我以前从未使用
QThread
过,我看到我们正在为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)))
解决方案
我知道一些关于 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_())
推荐阅读
- python-3.x - 如何在特定元素之后提取所有类“a”?
- python - Flask,在静态文件夹外显示图片
- javascript - Strapi GitHub Hook,没有看到最新的变化
- python - Simpy - 在特定时间设置资源请求
- css - 为什么我在 CSS 中使用 em 和 rem 单位得到不同的实际图像大小
- sql - 用于 UTC 转换的 SQL
- sql - 在一列oracle中获取非空值
- php - Laravel - 将部分会话内容添加到数组中
- hashtag - Getstream.io 在使用“to”字段时抛出异常
- r - 使用 R plotly 使所有刻度出现在轴上