【发布时间】:2019-03-21 01:24:11
【问题描述】:
我正在尝试在 PyQt5 中创建一个 GUI 应用程序,该应用程序从远程 GUI 连续接收数据并使用 pyqtgraph 绘制动画。 我正在使用 Python 套接字模块进行连接和传输数据。我正在为 GUI 和连接使用多线程。
图形用户界面和数据接收工作正常,但在处理接收到的数据进行绘图时,Qtimer 不会调用制作动画的方法。
import sys
import time
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi
from PyQt5.QtCore import QTimer
import socket
from threading import Thread
from socketserver import ThreadingMixIn
import numpy as np
import pyqtgraph as pg
class Window(QMainWindow):
def __init__(self):
super().__init__()
loadUi('app.ui', self)
self.plotWidget.plotItem.showGrid(True, True, 0.2)
self.serverThread=ServerThread()
self.serverThread.start()
def plot(self, amplitude):
self.y = amplitude * np.random.normal(size=600)
self.plotWidget.setXRange (0, 2)
self.plotWidget.setYRange (-0.5, 1)
Color = pg.mkPen('g', width=1)
self.curve = self.plotWidget.plot(self.y, pen=Color)
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.update)
self.timer.start(20)
#method that performs the animation
def update(self):
self.y[:-1] = self.y[1:] # shift data in the array one sample left
self.curve.setData(self.y)
class ServerThread(Thread):
def __init__(self):
Thread.__init__(self)
self.window=window
def run(self):
TCP_IP = '0.0.0.0'
TCP_PORT = 5000
BUFFER_SIZE = 20
tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpServer.bind((TCP_IP, TCP_PORT))
threads = []
tcpServer.listen(1)
while True:
print("Multithreaded Python server : Waiting for connections from TCP clients..")
global conn
(conn, (ip,port)) = tcpServer.accept()
newthread = ClientThread(ip,port)
newthread.start()
threads.append(newthread)
for t in threads:
t.join()
class ClientThread(Thread):
def __init__(self,ip,port):
Thread.__init__(self)
self.ip = ip
self.port = port
print("[+] New server socket thread started for " + ip + ":" + str(port))
def run(self):
while True :
global conn
data = conn.recv(2048)
data_recv = data.decode('utf-8')
data = int (data_recv)
window.plot(data)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
GUI 显示没有动画的情节。问题可能是什么?进程是否被阻塞? QThread 中的 QTimer 正在被垃圾收集吗?我做错了什么?
如果有人有想法,请帮助我。
【问题讨论】:
标签: python multithreading sockets pyqt5 qthread