【问题标题】:Add dynamic Text update to pyQt script将动态文本更新添加到 pyQt 脚本
【发布时间】:2021-03-14 19:40:40
【问题描述】:

我想在我当前的 pyqt 脚本中添加更新数据字段(数字)的功能。我尝试使用“addLabel”,但无法动态更新其内容。

关于如何制作它的任何建议?我正在使用 addPlot 函数来创建将处理来自 UDP 数据包的一些数据的图。在某些情况下,我只想动态显示值。不确定用于此目的的最佳小部件是什么?

当前脚本:

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
from pyqtgraph.ptime import time
import struct
from struct import pack, unpack
import socket 

app = QtGui.QApplication([])

data = []
data_throttle = []
data_brake = []
data_steering = []
data_state = []
data_error = []

pg.setConfigOption('background', (0,0,0))
#pg.setConfigOption(antialias=True)
win = pg.GraphicsWindow()
win.resize(500,200)
p1 = win.addPlot(title="Sequence")
p1.setWindowTitle('Sequence')
p1.setRange(QtCore.QRectF(0, 0, 100, 150)) 
#p1.setLabel('bottom', 'Packet', units=' ')
p1.showGrid(True, True)

p2 = win.addPlot(title="Throttle")
p2.setWindowTitle('Throttle')
p2.setRange(QtCore.QRectF(0, 0, 100, 255)) 
#p2.setLabel('bottom', 'Packet', units=' ')
p2.showGrid(True, True)

p3 = win.addPlot(title="Brake")
p3.setWindowTitle('Brake')
p3.setRange(QtCore.QRectF(0, 0, 100, 255)) 
#p3.setLabel('bottom', 'Packet', units=' ')
p3.showGrid(True, True)


p4 = win.addPlot(title="Steering")
p4.setWindowTitle('Steering')
p4.setRange(QtCore.QRectF(0, -1, 100, 2)) 
#p4.setLabel('bottom', 'Packet', units=' ')git 
p4.showGrid(True, True)

p5 = win.addPlot(title="Vehicle State")
p5.setWindowTitle('Vehicle State')
p5.setRange(QtCore.QRectF(0, 0, 100, 10)) 
#p5.setLabel('bottom', 'Packet', units=' ')
p5.showGrid(True, True)

p6 = win.addPlot(title="Errors")
p6.setWindowTitle('Errors')
p6.setRange(QtCore.QRectF(0, 0, 100, 10)) 
#p6.setLabel('bottom', 'Packet', units=' ')
p6.showGrid(True, True)



top_label = "Percent"
bottom_label = "85"
l_labels = win.addLayout(col=1, colspan=1)
l_labels.addLabel(top_label, row=0, col=0, rowspan=1, colspan=1, size='30pt', bold=True)
l_labels.addLabel(bottom_label, row=2, col=0, rowspan=4, colspan=1, size='200pt', color='606060')
l_labels.setContentsMargins(0, 0, 0, 100) 


curve = p1.plot(pen='r')
curve2 = p2.plot(pen='b')
curve3 = p3.plot(pen='g')
curve4 = p4.plot(pen='y')
curve5 = p5.plot(pen='r')
curve6 = p6.plot(pen='b')


# Receive UDP packets transmitted by a broadcasting service

RECEIVE_IP = ''
RECEIVE_PORT = 2337
RECEIVE_ADDRESS = (RECEIVE_IP, RECEIVE_PORT)


recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recv_socket.bind(RECEIVE_ADDRESS)
JOY_CODE = '=HBBBhHQQB'
ACK_CODE = '=HHBBHBBhBqB'

ptr = 0
lastTime = time()
fps = None
def update():
    global recv_socket, fScale
    global curve, data, data_throttle, data_brake, data_steering, ptr, p, lastTime, fps, data_state, data_error
    recv_message, address = recv_socket.recvfrom(22)
    message_id, ack_payload, ack_seq, vehicle_state, vehicle_speed, throttle, brake, steering, error, timestamp, checksum =  struct.unpack(ACK_CODE, recv_message) 
    #data = throttle
    data.append(ack_seq)
    data =  data[-100:]
   
    data_throttle.append(throttle)
    data_throttle =  data_throttle[-100:]
   
    data_brake.append(brake)
    data_brake =  data_brake[-100:]
   
    data_steering.append(steering / 32768)
    data_steering =  data_steering[-100:]

    vehicle_state = vehicle_state & 0x07
    data_state.append(vehicle_state)
    data_state = data_state[-100:]

    data_error.append(error)
    data_error = data_error[-100:]
   

    #print(throttle)
    #print("got data", data, "  ", lastTime, "\n")
    # print data
    #curve.setData(fScale,data,_callSync='off')
    curve.setData(data,_callSync='off')
    curve2.setData(data_throttle,_callSync='off')
    curve3.setData(data_brake,_callSync='off')
    curve4.setData(data_steering,_callSync='off')
    curve5.setData(data_state, _callSync='off')
    curve6.setData(data_error, _callSync='off')
    bottom_label = vehicle_state
    
    now = time()
    dt = now - lastTime
    lastTime = now

    app.processEvents()  ## force complete redraw for every plot
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(0)


## Start Qt event loop unless running in interactive mode.
if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

【问题讨论】:

    标签: python pyqt


    【解决方案1】:

    我能够通过在 Plot 中使用 TextItem 来找出解决方案

    from pyqtgraph.Qt import QtGui, QtCore
    import numpy as np
    import pyqtgraph as pg
    from pyqtgraph.ptime import time
    import struct
    from struct import pack, unpack
    import socket 
    
    app = QtGui.QApplication([])
    
    data = []
    data_throttle = []
    data_brake = []
    data_steering = []
    data_state = []
    data_error = []
    
    
    pg.setConfigOption('background', (0,0,0))
    #pg.setConfigOption(antialias=True)
    win = pg.GraphicsWindow()
    win.resize(1600,1000)
    p1 = win.addPlot(title="Sequence",row=0, col=1)
    p1.setWindowTitle('Sequence')
    p1.setRange(QtCore.QRectF(0, 0, 100, 150)) 
    p1.showGrid(True, True)
    
    p2 = win.addPlot(title="Throttle",row=0, col=2)
    p2.setWindowTitle('Throttle')
    p2.setRange(QtCore.QRectF(0, 0, 100, 255)) 
    p2.showGrid(True, True)
    
    p3 = win.addPlot(title="Brake",row=0, col=3)
    p3.setWindowTitle('Brake')
    p3.setRange(QtCore.QRectF(0, 0, 100, 255)) 
    p3.showGrid(True, True)
    
    
    p4 = win.addPlot(title="Steering",row=1, col=1)
    p4.setWindowTitle('Steering')
    p4.setRange(QtCore.QRectF(0, -1, 100, 2)) 
    p4.showGrid(True, True)
    
    p5 = win.addPlot(title="Vehicle State",row=1, col=2)
    p5.setWindowTitle('Vehicle State')
    p5.setRange(QtCore.QRectF(0, 0, 100, 10)) 
    p5.showGrid(True, True)
    
    p6 = win.addPlot(title="Errors",row=1, col=3)
    p6.setWindowTitle('Errors')
    p6.setRange(QtCore.QRectF(0, 0, 100, 10)) 
    p6.showGrid(True, True)
    
    p7 = win.addPlot(title="Counter",row=0, col=4)
    p8 = win.addPlot(title="Counter",row=1, col=4)
    
    font=QtGui.QFont()
    font.setPixelSize(300)
    
    anchor = pg.TextItem()
    anchor.setText("0")
    anchor.setColor(QtGui.QColor(255, 255, 255))
    anchor.setFont(font)
    
    anchor1 = pg.TextItem()
    anchor1.setText("0")
    anchor1.setColor(QtGui.QColor(255, 255, 255))
    anchor1.setFont(font)
    
    
    p7.addItem(anchor)
    p7.showGrid(False, False)
    p7.hideAxis('bottom')
    p7.hideAxis('left')
    
    p8.addItem(anchor1)
    p8.showGrid(False, False)
    p8.hideAxis('bottom')
    p8.hideAxis('left')
    
    
    
    
    curve = p1.plot(pen='r')
    curve2 = p2.plot(pen='b')
    curve3 = p3.plot(pen='g')
    curve4 = p4.plot(pen='y')
    curve5 = p5.plot(pen='r')
    curve6 = p6.plot(pen='b')
    
    
    # Receive UDP packets transmitted by a broadcasting service
    
    RECEIVE_IP = ''
    RECEIVE_PORT = 2337
    RECEIVE_ADDRESS = (RECEIVE_IP, RECEIVE_PORT)
    
    
    recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    recv_socket.bind(RECEIVE_ADDRESS)
    
    JOY_CODE = '=HBBBhHQQB'
    
    
    ACK_CODE = '=HHBBHBBhBqB'
    
    ptr = 0
    lastTime = time()
    fps = None
    def update():
        global recv_socket, fScale
        global curve, data, data_throttle, data_brake, data_steering, ptr, p, lastTime, fps, data_state, data_error
        recv_message, address = recv_socket.recvfrom(22)
        message_id, ack_payload, ack_seq, vehicle_state, vehicle_speed, throttle, brake, steering, error, timestamp, checksum =  struct.unpack(ACK_CODE, recv_message) 
        #data = throttle
        data.append(ack_seq)
        data =  data[-100:]
       
        data_throttle.append(throttle)
        data_throttle =  data_throttle[-100:]
       
        data_brake.append(brake)
        data_brake =  data_brake[-100:]
       
        data_steering.append(steering / 32768)
        data_steering =  data_steering[-100:]
    
        vehicle_state = vehicle_state & 0x07
        data_state.append(vehicle_state)
        data_state = data_state[-100:]
    
        data_error.append(error)
        data_error = data_error[-100:]
       
    
        curve.setData(data,_callSync='off')
        curve2.setData(data_throttle,_callSync='off')
        curve3.setData(data_brake,_callSync='off')
        curve4.setData(data_steering,_callSync='off')
        curve5.setData(data_state, _callSync='off')
        curve6.setData(data_error, _callSync='off')
    
        #Updating Text Value 
        anchor.setText(str(vehicle_state))
        anchor1.setText(str(vehicle_state))
    
        now = time()
        dt = now - lastTime
        lastTime = now
        app.processEvents()  ## force complete redraw for every plot
    
    timer = QtCore.QTimer()
    timer.timeout.connect(update)
    timer.start(0)
    
    
    ## Start Qt event loop unless running in interactive mode.
    if __name__ == '__main__':
        import sys
        if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            QtGui.QApplication.instance().exec_()
    

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多