解决PyQt5中使用柱状图和饼状图刷新问题

 

一、问题描述

在做一款番茄钟应用,其中包含数据统计功能,如下图:

解决PyQt5中使用柱状图和饼状图刷新问题_第1张图片

我遇到的问题是:当完成一个番茄钟后,需要对统计数据进行刷新,但是重新调用一下画图函数无效,下面贴出调用的这个画图函数:

class MyFigure(FigureCanvas, QWidget):
    def __init__(self,parent=None, minWidth=600,  minHeight=380,  dpi=120):
        #第一步:创建一个创建Figure
        self.fig = Figure(figsize=(8, 8), dpi=dpi)
        #第二步:在父类中激活Figure窗口
        super(MyFigure,self).__init__(self.fig) #此句必不可少,否则不能显示图形
        #第三步:创建一个子图,用于绘制图形用,111表示子图编号,如matlab的subplot(1,1,1)
        self.axes = self.fig.add_subplot(111)
        self.setMinimumSize(minWidth, minHeight)
        FigureCanvas.updateGeometry(self)
    #第四步:就是画图,【可以在此类中画,也可以在其它类中画】
    #画日分布图    
    def drawDayChart(self):
        periodHour=['0'+str(i) if i<10 else str(i) for i in range(24)]
        periodDict=dict(zip(periodHour,  [0]*24))
        with open('configFiles/history.txt',  'r') as f:
            lines=f.readlines()
            for line in lines:
                period=line[11:13]
                periodDict[period]+=1
        periodDictKeys=periodDict.keys()
        periodDictValues=periodDict.values()
        rects=self.axes.bar(periodDictKeys,  periodDictValues,  align='edge',  width=0.9,  color='green')
        self.axes.set_ylabel('番茄钟个数')
        self.axes.set_title('番茄钟日分布', color='blue')
        for rect in rects:
            x=rect.get_x()
            y=rect.get_height()
            if(y==0):
                continue
            self.axes.text(x,  1.01*y,  str(y),  va='bottom')

二、解决思路

1、首先确定每次刷新的时候,穿给图标的数据是否真正刷新,确定这一点后

2、尝试使用self.axes.clear()将之前画的图删除掉,然后重画---尝试后仍然不行

3、google :How to update a plot in matplotlib?

找到了这么几行代码:

    fig.canvas.draw()
    fig.canvas.flush_events()

 于是去matplotlib官网查文档,在我的函数中加入了self.fig.canvas.draw_idle()。

4、成功实现了刷新

最后的代码:

class MyFigure(FigureCanvas, QWidget):
    def __init__(self,parent=None, minWidth=600,  minHeight=380,  dpi=120):
        #第一步:创建一个创建Figure
        self.fig = Figure(figsize=(8, 8), dpi=dpi)
        #第二步:在父类中激活Figure窗口
        super(MyFigure,self).__init__(self.fig) #此句必不可少,否则不能显示图形
        #第三步:创建一个子图,用于绘制图形用,111表示子图编号,如matlab的subplot(1,1,1)
        self.axes = self.fig.add_subplot(111)
        self.setMinimumSize(minWidth, minHeight)
        FigureCanvas.updateGeometry(self)
    #第四步:就是画图,【可以在此类中画,也可以在其它类中画】
    #画日分布图    
    def drawDayChart(self):
        periodHour=['0'+str(i) if i<10 else str(i) for i in range(24)]
        periodDict=dict(zip(periodHour,  [0]*24))
        with open('configFiles/history.txt',  'r') as f:
            lines=f.readlines()
            for line in lines:
                period=line[11:13]
                periodDict[period]+=1
        periodDictKeys=periodDict.keys()
        periodDictValues=periodDict.values()
        #实现刷新的条件1
        self.axes.clear()
        rects=self.axes.bar(periodDictKeys,  periodDictValues,  align='edge',  width=0.9,  color='green')
        #实现刷新的条件2
        self.fig.canvas.draw_idle()
        self.axes.set_ylabel('番茄钟个数')
        self.axes.set_title('番茄钟日分布', color='blue')
        for rect in rects:
            x=rect.get_x()
            y=rect.get_height()
            if(y==0):
                continue
            self.axes.text(x,  1.01*y,  str(y),  va='bottom')

 

三、原因猜测

即使清空了self.axes 但是画布中可能还存在残留数据

self.axes.fig.draw_idle() 在官方文档中的描述是用于重画图表,因此尝试使用,最终解决了问题

你可能感兴趣的:(python,PyQt5)