我不明白将matplotlib图形链接到从Qt Designer创建的表单的最佳方法.我有一个我在QtDesigner中创建的表单,然后通过pyuic5编译为python.我的主要计划是:
import app_framework as af
import matplotlib
from PyQt5 import QtWidgets
import sys
matplotlib.use('Qt5Agg')
app = QtWidgets.QApplication(sys.argv)
form = af.MyApp()
form.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)
其中myApp调用从Qt Designer创建的app_framework.py表单,然后由pyuic5(design.py)转换:
from PyQt5.QtWidgets import QApplication, QMainWindow
import design
class MyApp(QMainWindow, design.Ui_mainWindow):
def __init(self):
super(self.__class__, self).__init__()
<button initializations>
<function definitions for button callbacks>
Run Code Online (Sandbox Code Playgroud)
我很困惑在这个框架中我可以将matplotlib图形链接到QtDesigner中的预制空窗口小部件,或类似的东西,这样我就可以在GUI窗口中绘制新数据(事情发生,按钮按下)等)
我在SO和matplotlib的网站上找到了一些线程,但我不确定我是否理解在Qt Designer表单中为这个小部件创建空间的正确过程,然后链接一个绘图,和/或创建一个小部件post hoc和然后链接和绘图.
到目前为止我所做的是在Qt Creator中创建一个空的QWidget,然后在pyuic5编译之后,我改变了design.py文件,如下所示:
from PyQt5 import QtCore, QtGui, QtWidgets
# **** ADDED THIS
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as Canvas
# ****
class Ui_mainWindow(object): …Run Code Online (Sandbox Code Playgroud) 我有非常大的二进制文件,其中包含y个传感器的x个int16数据点,以及带有一些基本信息的标题.二进制文件写为y值,每个采样时间最多x个样本,然后是另一组读数,依此类推.如果我想要所有数据,我使用的numpy.fromfile()工作非常好,速度快.不过,如果我只想传感器数据或只有特定的传感器的一个子集,我现在有一个可怕的双for回路,使用file.seek(),file.read()和struct.unpack()那需要永远.还有另一种方法可以在python中更快地完成这项工作吗?也许mmap()我不明白?或者只是使用整体fromfile()然后再采样?
data = numpy.empty(num_pts, sensor_indices)
for i in range(num_pts):
for j in range(sensor_indices):
curr_file.seek(bin_offsets[j])
data_binary = curr_file.read(2)
data[j][i] = struct.unpack('h', data_binary)[0]
Run Code Online (Sandbox Code Playgroud)
遵循@rrauenza的建议mmap,这是很好的信息,我编辑了代码
mm = mmap.mmap(curr_file.fileno(), 0, access=mmap.ACCESS_READ)
data = numpy.empty(num_pts,sensor_indices)
for i in range(num_pts):
for j in range(len(sensor_indices)):
offset += bin_offsets[j] * 2
data[j][i] = struct.unpack('h', mm[offset:offset+2])[0]
Run Code Online (Sandbox Code Playgroud)
虽然这比以前更快,但它仍然比数量级慢几个数量级
shape = (x, y)
data = np.fromfile(file=self.curr_file, dtype=np.int16).reshape(shape)
data = data.transpose()
data = data[sensor_indices, :]
data …Run Code Online (Sandbox Code Playgroud)