Tk醒目 如何自动刷新Canvas

Tk醒目 如何自动刷新Canvas

Tkinter问题。
我想做一个根据ping的返回时间,在座标上画点的脚本。
座标部分用Tkinter来完成。

现在卡在一个地方。
比方说10分钟ping一次主机,如何自动刷新Canvas,将结果画在座标上。

到现在的代码如下:

[Copy to clipboard] [ - ]
CODE:
class myCanvas(Tkinter.Canvas):
    dot = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #储存点的ID
    r = 3 #画的点的半径
    a = 0 #接收ping返回的时间
    def __init__(self, master):
        Tkinter.Canvas.__init__(self, master, relief=Tkinter.RAISED,\
                               width=450, height=120)
        self.pack()

        self.create_line(10, 100, 410, 100, width=2) # x轴
        self.create_line(10, 10, 10,  100, width=2) # y轴

        for i in range(20): #X轴小刻度
            self.create_line(10+20*i, 100, 10+20*i, 96, width=1)
        for i in range(10): #Y轴小刻度
            self.create_line(10, 10+9*i, 13, 10+9*i, width=1)

        self.bind( "<Button-1>", self.leftClick ) #按左键

    def leftClick(self, event):
        self.a = 0

        self.a = self.pingNode(timeout=10.0, number=1,\
                     node='10.254.241.33', flood=0, size=ICMP_DATA_STR)
        
        self.draw_dot(self.a)

    def draw_dot(self, draw_a): #画点
        if self.dot[0]:
            self.delete(self, self.dot[0]) #删除最左边的点,现在已经移出x轴了。

        for i in range(19):
            if self.dot[i]:
                self.move(self.dot[i], -20, 0) #依次向左移动每一个点
        for i in range(18):
            self.dot[i] = self.dot[i+1]

#根据ping返回时间画不同颜色的点
        if draw_a == -1: #ping不通
            self.dot[18] = self.create_oval(390-self.r, 10-self.r,\
                390+self.r, 10+self.r,width=1, outline='black', fill='red')
        else:
            if draw_a > 10: #pingtime >10
                self.dot[18] = self.create_oval(390-self.r, 10-self.r,\
                    390+self.r, 10+self.r,width=1, outline='black', fill='yellow')
            else: #10秒之内
                self.dot[18] = self.create_oval(390-self.r, 97-draw_a*9,\
                    390+self.r, 103-draw_a*9,width=1, outline='black', fill='SkyBlue2')
   

    def pingNode(self, timeout=5.0, number=5, node=None, \
                 flood=0, size=ICMP_DATA_STR):
        。。。 。。。

root = Tkinter.Frame()   
root.pack()
myCanvas(root)
root.mainloop()

大概就是这样了。
现在每点击一次Canvas,就可以根据ping来画一个点。
我想让它自动刷新,比如10分钟自动刷新一次,在座标上画点。

实在没办法了。
请大大指点。


做一个定时器啊!~
用obj.after()
这两天叫急性肠炎折腾死了,早上连肠炎的疼加小腿抽筋,那叫爽啊~
光顾着疼了,发烧38.5都没感觉.要命啊,以后再喝酒...再喝酒...陪我喝酒的就是猪!!
================感慨的分割线=========================
谢谢楼上指点,我这就试试.
8好意思哈,单位最近事多,晚上回家看球,嘻。
刚试了一下,稍微改了一下,在def draw_dot(self, draw_a): 的最后加上
self.after(1000) 的确可以刷新Canvas。

但是有个问题,想不明白。
修改之后的代码如下

[Copy to clipboard] [ - ]
CODE:
class myCanvas(Tkinter.Canvas):
    dot = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #储存点的ID
    r = 3 #画的点的半径
    a = 0 #接收ping返回的时间
    def __init__(self, master):
        Tkinter.Canvas.__init__(self, master, relief=Tkinter.RAISED,\
                               width=450, height=120)
        self.pack()

        self.create_line(10, 100, 410, 100, width=2) # x轴
        self.create_line(10, 10, 10,  100, width=2) # y轴

        for i in range(20): #X轴小刻度
            self.create_line(10+20*i, 100, 10+20*i, 96, width=1)
        for i in range(10): #Y轴小刻度
            self.create_line(10, 10+9*i, 13, 10+9*i, width=1)

        [color=Red]for i in range(5):[/color]
            [color=Red]self.leftClick()[/color]

    def leftClick(self, event):
        self.a = 0

        self.a = self.pingNode(timeout=10.0, number=1,\
                     node='10.254.241.33', flood=0, size=ICMP_DATA_STR)
        
        self.draw_dot(self.a)

    [color=Red]def draw_dot(self):#画点[/color]
        if self.dot[0]:
            self.delete(self, self.dot[0]) #删除最左边的点,现在已经移出x轴了。

        for i in range(19):
            if self.dot[i]:
                self.move(self.dot[i], -20, 0) #依次向左移动每一个点
        for i in range(18):
            self.dot[i] = self.dot[i+1]

            #根据ping返回时间画不同颜色的点
        if draw_a == -1: #ping不通
            self.dot[18] = self.create_oval(390-self.r, 10-self.r,\
                390+self.r, 10+self.r,width=1, outline='black', fill='red')
            else:
                if draw_a > 10: #pingtime >10
                    self.dot[18] = self.create_oval(390-self.r, 10-self.r,\
                        390+self.r, 10+self.r,width=1, outline='black', fill='yellow')
                else: #10秒之内
                self.dot[18] = self.create_oval(390-self.r, 97-draw_a*9,\
                    390+self.r, 103-draw_a*9,width=1, outline='black', fill='SkyBlue2')

             [color=Red]print 1 #注意!![/color]
             [color=Red]self.after(1000)[/color]

    def pingNode(self, timeout=5.0, number=5, node=None, \
                 flood=0, size=ICMP_DATA_STR):
        。。。 。。。

root = Tkinter.Frame()   
root.pack()
myCanvas(root)
root.mainloop()

红色的就是做过修改的部分
问题就是,
1。如果不加红色的print 1 部分,Canvas就会停住,直到5次循环过后,一次把5个点都画出来。
2。如果写了print 1,则是画一个点,sleep 1000ms,再刷新Canvas,画下一个点,如此循环5次。
点解??
我想要的是第2种的结果,怎么可以不写print 1就可以实现相同的功能??
又试了一下,还是不对,实在是对obj.after()不了解,大大能给详细的解释下么?