0

我想使用 mysql 表中的数据在 pyqt 中制作实时图表,但我不确定如何。该表将每秒更新一次,并具有 CPU 百分比(例如 2.5、3.5、4.5)。我不确定如何使用来自 mysql 的数据制作实时图表。

我在下面制作了一个简单的 matplotlib 图。我试图合并 mysql 数据,但我无法满足这个实时图表的需求。

import sys
from PyQt4 import QtGui
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg \
import FigureCanvasQTAgg as FigureCanvas
import psutil as p

# Total number of iterations
MAXITERS = 2000
class CPUMonitor(FigureCanvas):
    """Matplotlib Figure widget to display CPU utilization"""
    def __init__(self):
        # save the current CPU info (used by updating algorithm)
        self.before = self.prepare_cpu_usage()
        # first image setup
        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        # initialization of the canvas
        FigureCanvas.__init__(self, self.fig)
        # set specific limits for X and Y axes
        self.ax.set_xlim(0, 2000)
        self.ax.set_ylim(0, 100)
        # and disable figure-wide autoscale
        self.ax.set_autoscale_on(False)
        # generates first "empty" plots
        self.user, self.nice, self.sys, self.idle =[], [], [], []
        self.l_user, = self.ax.plot([],self.user, label='User %')
        self.l_nice, = self.ax.plot([],self.nice, label='Nice %')
        self.l_sys, = self.ax.plot([],self.sys, label='Sys %')
        self.l_idle, = self.ax.plot([],self.idle, label='Idle %')
        # add legend to plot
        self.ax.legend()
        # force a redraw of the Figure
        self.fig.canvas.draw()
        # initialize the iteration counter
        self.cnt = 0
        # call the update method (to speed-up visualization)
        self.timerEvent(None)
        # start timer, trigger event every 1000 millisecs (=1sec)
        self.timer = self.startTimer(1000)
    def prepare_cpu_usage(self):
        """helper function to return CPU usage info"""
        # get the CPU times using psutil module
        t = p.cpu_times()
        # return only the values we're interested in
        if hasattr(t, 'nice'):
            return [t.user, t.nice, t.system, t.idle]
        else:
            # special case focr Windows, without 'nice' value
            return [t.user, 0, t.system, t.idle]
    def get_cpu_usage(self):
        """Compute CPU usage comparing previous and current measurements"""
        # take the current CPU usage information
        now = self.prepare_cpu_usage()
        # compute delta between current and previous measurements
        delta = [now[i]-self.before[i] for i in range(len(now))]
        # compute the total (needed for percentages calculation)
        total = sum(delta)
        # save the current measurement to before object
        self.before = now
        # return the percentage of CPU usage for our 4 categories
        return [(100.0*dt)/total for dt in delta]
    def timerEvent(self, evt):
        # get the cpu percentage usage
        result = self.get_cpu_usage()
        # append new data to the datasets
        self.user.append(result[0])
        self.nice.append(result[1])
        self.sys.append( result[2])
        self.idle.append(result[3])
        # update lines data using the lists with new data
        self.l_user.set_data(range(len(self.user)), self.user)
        self.l_nice.set_data(range(len(self.nice)), self.nice)
        self.l_sys.set_data( range(len(self.sys)), self.sys)
        self.l_idle.set_data(range(len(self.idle)), self.idle)
        # force a redraw of the Figure
        self.fig.canvas.draw()
        if self.cnt == MAXITERS:
            # stop the timer
            self.killTimer(self.timer)
        else:
           #else, we increment the counter
           self.cnt += 1
# create the GUI application
widget = CPUMonitor()
widget.setWindowTitle("30 Seconds of CPU Usage Updated in RealTime")
widget.show()

sys.exit(app.exec_())
4

1 回答 1

0

一种选择是在无限循环中运行它。循环每秒都会检查表格,然后每次都重新绘制 matplotlib 图。

虽然这不是一个非常有效的解决方案。

于 2012-08-02T16:48:10.237 回答