luofeiyu -3 Newbie Poster

i have written a program in tkinter to draw stock graph,there are two strange thing i can't understand
the attachment is 'AAU' data file(attachment 1).when you download it ,please save it in /tmp/AAU
there is a scrolled canvas in it ,

1.strang long line,please see my attachment.
i have see my data ,my formulation ,no wrong,but the line is so long!!
2.there is no motion event reaction in the right of canvas,only motion event reaction in the left of canvas.
3.i have round function ,but the output is still more fractions than 2.

#coding:utf-8
from Tkinter import *
import string

class  hdraw(object):
    def  __init__(self,fname):
        file='/tmp/'+fname
        self.stock=fname
        self.data=(open(file,'r').readlines())[1:-1]
        self.data.reverse()
        self.xsqueen=range(0,len(self.data)*2,2)
        self.pairs=len(self.data)           
        #Open,High,Low,Close,Volume,Adj Close
        self.date         =[i.split(',')[0]   for  i  in  self.data]
        self.open         =[string.atof(i.split(',')[1])  for  i  in  self.data]
        self.high         =[string.atof(i.split(',')[2])  for  i  in  self.data]
        self.low          =[string.atof(i.split(',')[3])  for  i  in  self.data]
        self.close        =[string.atof(i.split(',')[4])  for  i  in  self.data]
        self.vol          =[string.atof(i.split(',')[5])  for  i  in  self.data]
        self.adjclose     =[string.atof(i.split(',')[6])  for  i  in  self.data]
        self.ymax         =max(self.open+self.high+self.low+self.close)
        self.ymin         =min(self.open+self.high+self.low+self.close)
        self.width        =self.pairs*4
        times=self.ymax//self.ymin+1
        if  times  < 5:
            self.height=times*180
        elif   5<= times  <10:
            self.height=times*100
        elif    10 <= times  <20:
            self.height=times*80
        else:
            self.height=times*50
      
     
    def  getyposition(self,p):
        yp=(50+self.height)-(p-self.ymin)*self.height/(self.ymax-self.ymin)
        return yp
     
    def  getxposition(self,x):
        xp=50+4*x
        return  xp
     
    def myprint(self,event):
        # convert the event coordinates to canvas coordinates
        x = canv.canvasx(event.x)
        y = canv.canvasy(event.y)
        # find the poistion in the top right corner of your canvas widget
        # less a little bit so as to see the displayed text
        if  x  in  self.xsqueen :
            ith=self.xsqueen.index(x)
            
             # delete previous displayed text
            canv.delete('coords')
             
            # display the coordinates
            canv.create_text(x,y,anchor=E,text='%s,%f,%f,%f,%f' % (self.date[ith],   \
            round(self.open[ith],2),round(self.high[ith],2),round(self.low[ith],2)   \
            ,round(self.close[ith],2)),tags='coords')
           
     
    def  drawcanvas(self):
        global  canv
        print  self.stock
        root.title('the history curve of %s'  %  self.stock)
        canv = Canvas(root, bg='white', relief=SUNKEN)
        canv.config(width=self.width+180,height=self.height+100)
        canv.config(scrollregion=(0,0,self.width+180,self.height+100))     
        canv.config(highlightthickness=0)
        ybar = Scrollbar(root)
        xbar=Scrollbar(root,orient='horizontal')
        ybar.config(command=canv.yview)
        xbar.config(command=canv.xview)                
        canv.config(yscrollcommand=ybar.set)
        canv.config(xscrollcommand=xbar.set)           
        ybar.pack(side=RIGHT, fill=Y)
        xbar.pack(side=BOTTOM,fill=X)                 
        canv.pack(side=LEFT, expand=YES, fill=BOTH)
        canv.create_text(20,20,text=self.stock)
        # display the coordinates
        canv.create_line(50,self.height+50,self.width+100,self.height+50,width=4)
        canv.create_line(50,self.height+50,50,0,width=4)
        canv.create_line(100+self.width,self.height+50,100+self.width,0,width=4)
        canv.create_line(50,self.getyposition(self.ymax),self.width+100,   \
                          self.getyposition(self.ymax),width=4)
        #the last day line 
        yyp=self.getyposition(self.close[-1])
        canv.create_line(50,yyp,100+self.width,yyp,width=2)
        #right  coordinates
        canv.create_text(135+self.width,yyp,text=str(self.close[-1])+'    '+'100%')
        #left  coordinates
        canv.create_text(35,yyp,text=str(self.close[-1]))
        #x  coordinates
        for i in range(0,self.pairs,20):
            canv.create_text(50+2*i,self.height+50,text=(self.date[i])   \
                       .split('-')[1],anchor=N)
        for i in range(0,self.pairs,120):
             canv.create_text(50+2*i,self.height+65,text=(self.date[i])   \
                       .split('-')[0],anchor=N)
             
        #draw  data
        p=self.close[-1]
        c=100
        while  p*1.1<self.ymax:
            c=c*1.1
            p=p*1.1
            yp=self.getyposition(p)
            canv.create_text(135+self.width,yp,text=str(round(c))+'%')
            canv.create_text(35,yp,text=str(round(p,2)))
            canv.create_line(50,yp,100+self.width,yp)
         
        p=self.close[-1]
        c=100
        while  p*0.9>self.ymin  and  c*0.9>25:
                c=c*0.9
                p=p*0.9
                yp=self.getyposition(p)
                canv.create_text(135+self.width,yp,text=str(round(c))+'%')
                canv.create_text(35,yp,text=str(round(p,2)))
                canv.create_line(50,yp,100+self.width,yp)
     
        #max price line
        canv.create_text(35,self.getyposition(self.ymax),text=str(self.ymax))
        #min price line
        canv.create_text(35,self.getyposition(self.ymin),text=str(self.ymin))
         
        canv.bind("<Motion>",self.myprint)
        for i in range(0,self.pairs):
            if  self.close[i]  >=  self.open[i] :
                colour='green'
            else:
                colour='red'
            #draw  k  line 
            x1=self.getxposition(i)
            y1=self.getyposition(self.open[i])
            x2=x1
            y2=self.getyposition(self.high[i])
            x3=x1
            y3=self.getyposition(self.low[i])
            x4=x1
            y4=self.getyposition(self.close[i])
            canv.create_line(x2,y2,x3,y3,fill=colour)
            canv.create_line(x1-2,y1,x1,y1,fill=colour)
            canv.create_line(x1,y4,x1+2,y4,fill=colour)


root = Tk()
s=hdraw('AAU')
s.drawcanvas() 
root.mainloop()
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.