首先,我是Python的新手。我是MatLab的长期用户(工程师,而不是计算机科学家),并且开始尝试将Python,NumPy,SciPy等工作到我的工作流程中的过程。因此,请原谅我对什么是出色的编程语言的明显无知!
作为我的第一项努力,我决定构建一个与正在开发的传感器进行交互的应用程序。传感器具有微秒级的分辨率(每500微秒来自512个高能量和512个低能量“像素”的数据),但是I
/
O会阻塞。由于我将不断轮询设备,因此我知道线程化对于使GUI保持响应非常重要(GUI最终还将最终与其他设备集成串行通信,并具有对传感器数据进行操作的图像处理子例程)。我创建了MatPlotLib的线程实例,以绘制来自传感器的这些“实时”数据。尽管我已经构建了独立与传感器通信的模块并验证了我知道如何在Python中进行此操作,但我还是从“模拟”开始
通过针对低能量“像素”生成512个随机数(介于8和12之间)和512个随机数(介于90和110之间),以生成低能量的“像素”。那就是线程。通过这里的许多示例,我还学会了使用blitting通过MatPlotLib-
BUT来获得足够快的屏幕更新,问题是,除非我使用以下方法使线程进程进入睡眠状态20毫秒time.sleep(0.02)
,GUI没有响应。这可以得到验证,因为来自MatPlotLib的交互式X,Y数据点反馈不起作用,并且无法使用“停止”按钮来中断该过程。任何比time.sleep(0.02)
使GUI更加平滑运行更长的时间,但以“数据速率”为代价。任何比time.sleep(0.02)
使GUI无响应都慢的速度。我不确定我为什么。我本来打算改用GUIqwt,但是我想在放弃MatPlotLib之前会在这里询问,因为我不确定这是否是问题所在。我担心将线程休眠20ms意味着我错过了传感器阵列中至少40条潜在的数据行(40行*
500us /行= 20ms)。
这是当前代码:
import time, random, sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
class ApplicationWindow(QMainWindow):
def __init__(self, parent = None):
QMainWindow.__init__(self, parent)
self.thread = Worker()
self.create_main_frame()
self.create_status_bar()
self.connect(self.thread, SIGNAL("finished()"), self.update_UI)
self.connect(self.thread, SIGNAL("terminated()"), self.update_UI)
self.connect(self.startButton, SIGNAL("clicked()"), self.start_acquisition)
self.connect(self.stopButton, SIGNAL("clicked()"), self.stop_acquisition)
self.thread.pixel_list.connect(self.update_figure)
def create_main_frame(self):
self.main_frame = QWidget()
self.dpi = 100
self.width = 10
self.height = 8
self.fig = Figure(figsize=(self.width, self.height), dpi=self.dpi)
self.axes = self.fig.add_subplot(111)
self.axes.axis((0,512,0,120))
self.canvas = FigureCanvas(self.fig)
self.canvas.setParent(self.main_frame)
self.canvas.updateGeometry()
self.canvas.draw()
self.background = None
self.lE_line, = self.axes.plot(range(512), [0 for i in xrange(512)], animated=True)
self.hE_line, = self.axes.plot(range(512), [0 for i in xrange(512)], animated=True)
self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
self.startButton = QPushButton(self.tr("&Start"))
self.stopButton = QPushButton(self.tr("&Stop"))
layout = QGridLayout()
layout.addWidget(self.canvas, 0, 0)
layout.addWidget(self.mpl_toolbar, 1, 0)
layout.addWidget(self.startButton, 2, 0)
layout.addWidget(self.stopButton, 2, 1)
self.main_frame.setLayout(layout)
self.setCentralWidget(self.main_frame)
self.setWindowTitle(self.tr("XRTdev Interface"))
def create_status_bar(self):
self.status_text = QLabel("I am a status bar. I need a status to show!")
self.statusBar().addWidget(self.status_text, 1)
def start_acquisition(self):
self.thread.exiting = False
self.startButton.setEnabled(False)
self.stopButton.setEnabled(True)
self.thread.render()
def stop_acquisition(self):
self.thread.exiting = True
self.startButton.setEnabled(True)
self.stopButton.setEnabled(False)
self.cleanup_UI()
def update_figure(self, lE, hE):
if self.background == None:
self.background = self.canvas.copy_from_bbox(self.axes.bbox)
self.canvas.restore_region(self.background)
self.lE_line.set_ydata(lE)
self.hE_line.set_ydata(hE)
self.axes.draw_artist(self.lE_line)
self.axes.draw_artist(self.hE_line)
self.canvas.blit(self.axes.bbox)
def update_UI(self):
self.startButton.setEnabled(True)
self.stopButton.setEnabled(False)
self.cleanup_UI()
def cleanup_UI(self):
self.background = None
self.axes.clear()
self.canvas.draw()
class Worker(QThread):
pixel_list = pyqtSignal(list, list)
def __init__(self, parent = None):
QThread.__init__(self, parent)
self.exiting = False
def __del__(self):
self.exiting = True
self.wait()
def render(self):
self.start()
def run(self):
# simulate I/O
n = random.randrange(100,200)
while not self.exiting and n > 0:
lE = [random.randrange(5,16) for i in xrange(512)]
hE = [random.randrange(80,121) for i in xrange(512)]
self.pixel_list.emit(lE, hE)
time.sleep(0.02)
n -= 1
def main():
app = QApplication(sys.argv)
form = ApplicationWindow()
form.show()
app.exec_()
if __name__ == "__main__":
main()
也许我的问题甚至不是MatPlotLib或PyQT4,而是我实现线程的方式。正如我指出的那样,我对此并不陌生。而且,我什至不确定GUIqwt是否会解决这些问题中的任何一个-
但我确实知道我在这里看到了许多建议,它们可以比MatPlotLib更快地在GUI中进行“实时”绘图。感谢您的帮助!
[编辑,因为QThread
令人困惑/困惑]
似乎有两种使用方式,要么将其子类化(如您的示例和文档所述),要么创建一个worker对象,然后将其移动到线程中(请参阅此博客文章)。然后,当您混入信号/插槽时,我会更加困惑。正如Avaris所说,这种变化可能不是您的问题。
我将您的Worker
课程重新设计为的子课程QObject
(因为这是我理解的风格)。
一个问题是,如果不将asleep
放入假数据系统中,则会在不到1秒的时间内生成所有对主窗口的回调。然后,主线程在清除信号队列时实际上被阻塞了。如果将延迟设置为指定的延迟(0.0005s),则它会通过生成远远超过其显示速度的数据来加速运行,这似乎表明这可能不适合您的问题(务实,您也可以看不到那么快,而且似乎可以以30-40
fps播放)。
import time, random, sys
#from PySide.QtCore import *
#from PySide.QtGui import *
from PyQt4 import QtCore
from PyQt4 import QtGui
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
class ApplicationWindow(QtGui.QMainWindow):
get_data = QtCore.pyqtSignal()
def __init__(self, parent = None):
QtGui.QMainWindow.__init__(self, parent)
self.thread = QtCore.QThread(parent=self)
self.worker = Worker(parent=None)
self.worker.moveToThread(self.thread)
self.create_main_frame()
self.create_status_bar()
self.startButton.clicked.connect(self.start_acquisition)
self.stopButton.clicked.connect(self.stop_acquisition)
self.worker.pixel_list.connect(self.update_figure)
self.worker.done.connect(self.update_UI)
self.get_data.connect(self.worker.get_data)
self.thread.start()
def create_main_frame(self):
self.main_frame = QtGui.QWidget()
self.dpi = 100
self.width = 10
self.height = 8
self.fig = Figure(figsize=(self.width, self.height), dpi=self.dpi)
self.axes = self.fig.add_subplot(111)
self.axes.axis((0,512,0,120))
self.canvas = FigureCanvas(self.fig)
self.canvas.setParent(self.main_frame)
self.canvas.updateGeometry()
self.canvas.draw()
self.background = None
self.lE_line, = self.axes.plot(range(512), [0 for i in xrange(512)], animated=True)
self.hE_line, = self.axes.plot(range(512), [0 for i in xrange(512)], animated=True)
self.mpl_toolbar = NavigationToolbar(self.canvas, self.main_frame)
self.startButton = QtGui.QPushButton(self.tr("&Start"))
self.stopButton = QtGui.QPushButton(self.tr("&Stop"))
layout = QtGui.QGridLayout()
layout.addWidget(self.canvas, 0, 0)
layout.addWidget(self.mpl_toolbar, 1, 0)
layout.addWidget(self.startButton, 2, 0)
layout.addWidget(self.stopButton, 2, 1)
self.main_frame.setLayout(layout)
self.setCentralWidget(self.main_frame)
self.setWindowTitle(self.tr("XRTdev Interface"))
def create_status_bar(self):
self.status_text = QtGui.QLabel("I am a status bar. I need a status to show!")
self.statusBar().addWidget(self.status_text, 1)
def start_acquisition(self):
self.worker.exiting = False
self.startButton.setEnabled(False)
self.stopButton.setEnabled(True)
self.get_data.emit()
def stop_acquisition(self):
self.worker.exiting = True
self.startButton.setEnabled(True)
self.stopButton.setEnabled(False)
self.cleanup_UI()
def update_figure(self, lE, hE):
if self.background == None:
self.background = self.canvas.copy_from_bbox(self.axes.bbox)
self.canvas.restore_region(self.background)
self.lE_line.set_ydata(lE)
self.hE_line.set_ydata(hE)
self.axes.draw_artist(self.lE_line)
self.axes.draw_artist(self.hE_line)
self.canvas.blit(self.axes.bbox)
def update_UI(self):
self.startButton.setEnabled(True)
self.stopButton.setEnabled(False)
self.cleanup_UI()
def cleanup_UI(self):
self.background = None
self.axes.clear()
self.canvas.draw()
class Worker(QtCore.QObject):
pixel_list = QtCore.pyqtSignal(list, list)
done = QtCore.pyqtSignal()
def __init__(self, parent = None):
QtCore.QObject.__init__(self, parent)
self.exiting = True
@QtCore.pyqtSlot()
def get_data(self):
# simulate I/O
print 'data_start'
n = random.randrange(100,200)
html" target="_blank">while not self.exiting and n > 0:
lE = [random.randrange(5,16) for i in xrange(512)]
hE = [random.randrange(80,121) for i in xrange(512)]
self.pixel_list.emit(lE, hE)
time.sleep(0.05)
n -= 1
print 'n: ', n
self.done.emit()
我有一个宽度为1900和高度为1000的图像,我使用的是和但我希望div高度与图像更改的高度相同。 示例: 在1366个屏幕中,图像将缩小尺寸以适应屏幕大小(宽度100%),因此,图像高度也将减小,因此我想获得该高度。 我试图做的是: HTML: CSS: 问题:vw是用滚动条宽度计算的,我想要没有,我可以使用宽度%而不是vw吗? 我接受别人的想法来做这件事,但我更喜欢使用CSS。
我需要帮助来完成Woocommerce产品列表的SQL查询。我需要将其用于WPDataTableSQL输入。 我搜索了一个示例代码,并修改了找到的代码: 它可以工作,但没有可变产品的产品行。它只显示产品的主要变化。 产品牛排:我有6种不同的牛排作为自己的产品,价格不同,重量也不同。通过我的SQL查询,我只能看到主产品“牛排”,没有变化和变化价格。 表wp_员额 表wp_Posteta- wp_术语
问题内容: 当我给图像一个宽度或高度的百分比时,它只会保持其宽高比增长/缩小,但是如果我想与另一个元素具有相同的效果,是否可以完全使用百分比将宽度和高度绑定在一起? 问题答案: 您可以使用纯CSS来完成;无需JavaScript。这利用了百分比(相对于包含块的 width)的(有点违反直觉)事实。这是一个例子:
问题内容: 当我给图像一个宽度或高度的百分比时,它只会保持其宽高比增长/缩小,但是如果我想与另一个元素具有相同的效果,是否完全可以使用百分比将宽度和高度绑定在一起? 问题答案: 您可以使用纯CSS来实现;无需JavaScript。这利用了百分比(相对于包含块的width)(有点违反直觉)的事实。这是一个例子:
我试图重定向到某个以捕获我的付款,我必须传递和以从控制器捕获,但路由会产生如下错误 提前谢谢 我犯的错误 我的路线 控制器 刀身razorpay完成后的php
我创建了一个Android应用程序,并将其上传到Google Play。它似乎不适用于大多数设备。我在Google Play控制台中看到以下消息: Android应用程序不支持所需的ABI-x86_64 该项目没有使用任何NDK或类似的东西。这是应该在大多数设备上运行的标准项目。我已经在Galaxy S8上单独测试了. apk,它运行良好。但是如果我想从Google Play下载它,它显示设备不兼