运行 来自函数的 pyqtgraph

run pyqtgraph from function

我在 pyqtgraph 中创建了下图。它 运行 没问题,可以正常显示。

import numpy as np
import pyqtgraph as pg
import pyqtgraph.exporters

from pyqtgraph.Qt import QtCore, QtGui
import csv
import itertools
from datetime import datetime as dt


app = QtGui.QApplication([])


class TimeAxisItem(pg.AxisItem):
    def tickStrings(self, values, scale, spacing):
            return [dt.fromtimestamp(value) for value in values]


x_vals = [dt(2018, 7, 1, 13, 6, 38), dt(2018, 7, 1, 12, 46, 38), dt(2018, 7, 1, 12, 36, 38), dt(2018, 7, 1, 12, 26, 38), dt(2018, 7, 1, 12, 16, 38), dt(2018, 7, 1, 12, 6, 38), dt(2018, 7, 1, 11, 56, 38), dt(2018, 7, 1, 11, 46, 38), dt(2018, 7, 1, 11, 36, 38), dt(2018, 7, 1, 11, 26, 38), dt(2018, 7, 1, 10, 56, 38), dt(2018, 7, 1, 10, 46, 38), dt(2018, 7, 1, 10, 36, 38)]
y_vals =  [23.5, 20.8, 28.0, 28.1, 28.0, 27.8, 27.3, 27.2, 25.7, 24.7, 25.0, 25.0, 24.9]


date_axis = TimeAxisItem(orientation='bottom')
plt = pg.PlotWidget(axisItems = {'bottom': date_axis})

# set properties
plt.setLabel('left', 'Temperature', units='C')
plt.setWindowTitle('Temperature over time')

plt.plot(x=[x.timestamp() for x in x_vals], y=y_vals, symbol=None, pen='r', symbolPen='r')
plt.show()  



if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

然而,当我尝试从函数中 运行 它时,它闪烁然后消失,但 pyqt 仍然 运行ning..

import numpy as np
import pyqtgraph as pg
import pyqtgraph.exporters

from pyqtgraph.Qt import QtCore, QtGui
import csv
import itertools
from datetime import datetime as dt


app = QtGui.QApplication([])


class TimeAxisItem(pg.AxisItem):
    def tickStrings(self, values, scale, spacing):
        return [dt.fromtimestamp(value) for value in values]

def Gshow():
    # app = QtGui.QApplication([])
    x_vals = [dt(2018, 7, 1, 13, 6, 38), dt(2018, 7, 1, 12, 46, 38), dt(2018, 7, 1, 12, 36, 38), dt(2018, 7, 1, 12, 26, 38), dt(2018, 7, 1, 12, 16, 38), dt(2018, 7, 1, 12, 6, 38), dt(2018, 7, 1, 11, 56, 38), dt(2018, 7, 1, 11, 46, 38), dt(2018, 7, 1, 11, 36, 38), dt(2018, 7, 1, 11, 26, 38), dt(2018, 7, 1, 10, 56, 38), dt(2018, 7, 1, 10, 46, 38), dt(2018, 7, 1, 10, 36, 38)]
    y_vals =  [23.5, 20.8, 28.0, 28.1, 28.0, 27.8, 27.3, 27.2, 25.7, 24.7, 25.0, 25.0, 24.9]

    date_axis = TimeAxisItem(orientation='bottom')

    plt = pg.PlotWidget(axisItems = {'bottom': date_axis})

    # set properties
    plt.setLabel('left', 'Temperature', units='C')
    plt.setWindowTitle('Temperature over time')

    plt.plot(x=[x.timestamp() for x in x_vals], y=y_vals, symbol=None, pen='r', symbolPen='r')
    plt.show()  

Gshow()


if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

如何 运行 函数的图形而不崩溃?

在 main() 中调用 Gshow()

问题很简单,在函数中创建的变量只存在于函数执行完毕之前,你的情况是plt被没有显示的东西消除了,解决办法是增加那个数据的范围,a这样做的形式是 return 它并将它传递给具有更大范围的变量。

import numpy as np
import pyqtgraph as pg
import pyqtgraph.exporters

from pyqtgraph.Qt import QtCore, QtGui
import csv
import itertools
from datetime import datetime as dt


app = QtGui.QApplication([])


class TimeAxisItem(pg.AxisItem):
    def tickStrings(self, values, scale, spacing):
        return [dt.fromtimestamp(value) for value in values]

def Gshow():
    # app = QtGui.QApplication([])
    x_vals = [dt(2018, 7, 1, 13, 6, 38), dt(2018, 7, 1, 12, 46, 38), dt(2018, 7, 1, 12, 36, 38), dt(2018, 7, 1, 12, 26, 38), dt(2018, 7, 1, 12, 16, 38), dt(2018, 7, 1, 12, 6, 38), dt(2018, 7, 1, 11, 56, 38), dt(2018, 7, 1, 11, 46, 38), dt(2018, 7, 1, 11, 36, 38), dt(2018, 7, 1, 11, 26, 38), dt(2018, 7, 1, 10, 56, 38), dt(2018, 7, 1, 10, 46, 38), dt(2018, 7, 1, 10, 36, 38)]
    y_vals =  [23.5, 20.8, 28.0, 28.1, 28.0, 27.8, 27.3, 27.2, 25.7, 24.7, 25.0, 25.0, 24.9]

    date_axis = TimeAxisItem(orientation='bottom')

    plt = pg.PlotWidget(axisItems = {'bottom': date_axis})

    # set properties
    plt.setLabel('left', 'Temperature', units='C')
    plt.setWindowTitle('Temperature over time')

    plt.plot(x=[x.timestamp() for x in x_vals], y=y_vals, symbol=None, pen='r', symbolPen='r')
    plt.show()  

    return plt  # <----

var = Gshow() # <----


if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()