无法在画布中更新图表

时间:2015-03-25 12:21:32

标签: python-2.7 tkinter tkinter-canvas

在下面的代码我不能让图表更新一个特定的延迟,所以它看起来好像在线更新,我已经使用after方法调用一个函数,它会给它新的,但我仍然得到整个图表,我也试过time.sleep甚至不起作用

#!/usr/bin/python

from numpy import *
from Tkinter import *
import time
from functools import partial


class Gui():



    def __init__(self,parent):


        self.parent=parent
        mL=[]
        mV=[]
        for i in range(0,10):
            ml_val=10 + i*0.1
            mv_val=1000 + i
            mL.append(ml_val)
            mV.append(mv_val)    
        frame = Frame(self.parent, width=900, height=900, bd=1)
        frame.pack()

        iframe5 = Frame(frame, bd=2,width=800, height=800, relief=RAISED)
        iframe5.pack( pady=10, padx=5)
        self.w = Canvas(iframe5, bg='white', width=600, height=510)
        self.w.pack()

        self.w.create_rectangle(1,1, 599, 509, fill="cyan")

        self.w.create_line(50,460,50,70,fill="#222")
        self.w.create_line(50, 460, 500, 460, fill="#222")
        self.w.create_text(400,55,text="mL vs mV Graph")
        self.w.create_text(390,75,text="mL : X - axis ")
        self.w.create_text(390,95,text="mV : Y - axis ")
        self.w.create_text(30,55,text="Y-Axis")
        self.w.create_text(530,480,text="X-Axis")
        y_range=450
        x_range=90

        self.y_plot=[]
        self.x_plot=[]
        for i in range(0,10):
            self.w.create_text(20,y_range,text=mV[i])
            self.w.create_text(x_range,480,text=mL[i])
            self.x_plot.append(x_range)
            self.y_plot.append(y_range)
            self.w.create_line(40,y_range,50,y_range, fill="blue")
            self.w.create_line(x_range,460,x_range,470, fill="blue")
            y_range -=40
            x_range +=40
       # time.sleep(10)
        for i in range(0,9):
            root.after(1000, partial(self.create_graph,i))        
            time.sleep(1)
    def create_graph(self,i):

        self.w.create_line(self.x_plot[i],self.y_plot[i],self.x_plot[i+1],self.y_plot[i+1], fill="blue")



if __name__== "__main__":
    root = Tk()
 #   root.attributes('-fullscreen',True)
    app=Gui(root)
    root.mainloop()

1 个答案:

答案 0 :(得分:2)

对所有点使用after(1000, ...),您计划在__init__完成后绘制1000毫秒,即它们全部在同一时间绘制。添加sleep只会延迟__init__完成的时间,从而缩短显示用户界面的时间。

相反,您应该在__init__之后安排不同次的不同点:

def __init__(self, parent):
    # other initialization code
    for i in range(0, 9):
        root.after(1000 * i, partial(self.create_graph, i))        

或者,在after的末尾添加一个__init__来安排第一个点的绘制,并在after方法中另外create_graph绘制下一个点

def __init__(self, parent):
    # other initialization code
    # at the end, remove the for loop and instead call after
    root.after(1000, partial(self.create_graph, 0, 9))        

def create_graph(self, i, k):
    self.w.create_line(self.x_plot[i],self.y_plot[i],self.x_plot[i+1],self.y_plot[i+1], fill="blue")
    # call after again to schedule drawing more points
    if i < k:
        root.after(1000, partial(self.create_graph, i+1, 9))