Виджет график(тренд)

Виджет график выводит в реальном времени аналоговые показания,
получаемые от измерительных устройств.




def hTrendC – функция создания объекта
Возвратные значения:

return (c,'htrend',x,y,widgLen,widgHigh,maxValue,outerColor,nameValue)

с – ссылка на объект
‘hmeter’ – строковый идентификатор объекта
х – координата х
у – координата у
widgLen – ширина виджета,
widgHigh – высота виджета,
maxValue – максимальное измеряемое значение,
outerColor – цвет заполнения ,
nameValue – название измеряемого значения

def hTrendC(x,y,widgLen,widgHigh,maxValue,outerColor,nameValue):
     c = Canvas(root,width=widgLen+50,height=widgHigh+40,bg="black",bd=0, highlightthickness=0, relief='ridge')
     c.place(x=x, y=y)
     return (c,'htrend',x,y,widgLen,widgHigh,maxValue,outerColor,nameValue)


def hTrend – функция отображения значений на canvas
arrayData -- массив параметров
arrayValue – массив измеренных значений

def hTrend(arrayData,arrayValue):
     c,markErr,x,y,widgLen,widgHigh,maxValue,outerColor,nameValue=arrayData
     c.create_rectangle(1,1,widgLen,widgHigh,fill='black',outline=outerColor)
     c.create_line(50,widgHigh/2,widgLen-5,widgHigh/2,width=0.1,fill='white',dash=(4, 2))
     c.create_line(50,widgHigh/4,widgLen-5,widgHigh/4,width=0.1,fill='white',dash=(4, 2))
     c.create_line(50,widgHigh - widgHigh/4,widgLen-5,widgHigh -widgHigh/4,width=0.2,fill='white',dash=(4, 2))
     c.create_text(10,widgHigh-10,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=0)
     c.create_text(10,12,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(maxValue))
     c.create_text(10,widgHigh/2,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(int(maxValue/2)))
     c.create_text(10,widgHigh/4,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(int(maxValue-maxValue/4)))
     c.create_text(10,widgHigh - widgHigh/4 ,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(int(maxValue/4)))
     c.create_text(1,widgHigh+25,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=nameValue)
     oldy=widgHigh-arrayValue[0]
     oldx=5
     xval=0
     for counter in range(0,len(arrayValue)):
         val=arrayValue[counter]
         yval=widgHigh-val
         xval+=10
         c.create_line(oldx,oldy,xval,yval,width=1.5,fill='green')
         oldy=yval
         oldx=xval
     c.create_line(xval,widgHigh-10,xval,0,width=0.5,fill='white')
     c.create_text(xval+10,yval,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(yval))
     c.create_text(xval+10,yval+20,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=time.strftime('%H:%M:%S'))


Ниже приведен пример программы отображения графика,
в качестве массива входных данных используется random.



import sys
import os
import time
import random
from Tkinter import *
def hTrendC(x,y,widgLen,widgHigh,maxValue,outerColor,nameValue):
     c = Canvas(root,width=widgLen+50,height=widgHigh+40,bg="black",bd=0, highlightthickness=0, relief='ridge')
     c.place(x=x, y=y)
     return (c,'htrend',x,y,widgLen,widgHigh,maxValue,outerColor,nameValue)
def hTrend(arrayData,arrayValue):
     c,markErr,x,y,widgLen,widgHigh,maxValue,outerColor,nameValue=arrayData
     c.create_rectangle(1,1,widgLen,widgHigh,fill='black',outline=outerColor)
     c.create_line(50,widgHigh/2,widgLen-5,widgHigh/2,width=0.1,fill='white',dash=(4, 2))
     c.create_line(50,widgHigh/4,widgLen-5,widgHigh/4,width=0.1,fill='white',dash=(4, 2))
     c.create_line(50,widgHigh - widgHigh/4,widgLen-5,widgHigh -widgHigh/4,width=0.2,fill='white',dash=(4, 2))
     c.create_text(10,widgHigh-10,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=0)
     c.create_text(10,12,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(maxValue))
     c.create_text(10,widgHigh/2,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(int(maxValue/2)))
     c.create_text(10,widgHigh/4,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(int(maxValue-maxValue/4)))
     c.create_text(10,widgHigh - widgHigh/4 ,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(int(maxValue/4)))
     c.create_text(1,widgHigh+25,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=nameValue)
     oldy=widgHigh-arrayValue[0]
     oldx=5
     xval=0
     for counter in range(0,len(arrayValue)):
         val=arrayValue[counter]
         yval=widgHigh-val
         xval+=10
         c.create_line(oldx,oldy,xval,yval,width=1.5,fill='green')
         oldy=yval
         oldx=xval
     c.create_line(xval,widgHigh-10,xval,0,width=0.5,fill='white')
     c.create_text(xval+10,yval,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=str(yval))
     c.create_text(xval+10,yval+20,font="Verdana 10",anchor="w",justify=CENTER,fill='white',text=time.strftime('%H:%M:%S'))

def jobTrend():
     global mesureValue
     lenVal = len(mesureValue)+1
     mesureValue.append(lenVal)
     mesureValue[lenVal-1] = randVal = random.randint(180, 240)
     tr1[0].delete("all")
     hTrend(tr1,mesureValue)
     if(len(mesureValue) == 80):
         mesureValue=None
         mesureValue=[]
     root.update()
     root.after(timeDelay, jobTrend)
if __name__ == "__main__":
     root = Tk()
     root.title("trend")
     if(os.name=='nt'): root.state("zoomed")
     else: root.state("normal")
     root["bg"] = "black"
     mesureValue=[]
     tr1=hTrendC(10,60,800,400,400,'red','Phase A Current')
     timeDelay=200
     root.after(1, jobTrend)
     root.mainloop()