免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8552 | 回复: 4

Tk醒目 如何自动刷新Canvas [复制链接]

论坛徽章:
0
发表于 2006-06-12 14:27 |显示全部楼层
Tkinter问题。
我想做一个根据ping的返回时间,在座标上画点的脚本。
座标部分用Tkinter来完成。

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

到现在的代码如下:

  1. class myCanvas(Tkinter.Canvas):
  2.     dot = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #储存点的ID
  3.     r = 3 #画的点的半径
  4.     a = 0 #接收ping返回的时间
  5.     def __init__(self, master):
  6.         Tkinter.Canvas.__init__(self, master, relief=Tkinter.RAISED,\
  7.                                width=450, height=120)
  8.         self.pack()

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

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

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

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

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

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

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

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

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

  45. root = Tkinter.Frame()   
  46. root.pack()
  47. myCanvas(root)
  48. root.mainloop()
复制代码


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

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


[ 本帖最后由 ouiki 于 2006-6-12 14:30 编辑 ]

论坛徽章:
0
发表于 2006-06-13 22:59 |显示全部楼层
做一个定时器啊!~
用obj.after()

论坛徽章:
0
发表于 2006-06-14 09:59 |显示全部楼层
这两天叫急性肠炎折腾死了,早上连肠炎的疼加小腿抽筋,那叫爽啊~
光顾着疼了,发烧38.5都没感觉.要命啊,以后再喝酒...再喝酒...陪我喝酒的就是猪!!
================感慨的分割线=========================
谢谢楼上指点,我这就试试.

论坛徽章:
0
发表于 2006-06-15 14:38 |显示全部楼层
8好意思哈,单位最近事多,晚上回家看球,嘻。
刚试了一下,稍微改了一下,在def draw_dot(self, draw_a): 的最后加上
self.after(1000) 的确可以刷新Canvas。

但是有个问题,想不明白。
修改之后的代码如下
  1. class myCanvas(Tkinter.Canvas):
  2.     dot = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #储存点的ID
  3.     r = 3 #画的点的半径
  4.     a = 0 #接收ping返回的时间
  5.     def __init__(self, master):
  6.         Tkinter.Canvas.__init__(self, master, relief=Tkinter.RAISED,\
  7.                                width=450, height=120)
  8.         self.pack()

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

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

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

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

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

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

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

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

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

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

  47. root = Tkinter.Frame()   
  48. root.pack()
  49. myCanvas(root)
  50. root.mainloop()
复制代码


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

论坛徽章:
0
发表于 2006-06-15 14:52 |显示全部楼层
又试了一下,还是不对,实在是对obj.after()不了解,大大能给详细的解释下么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP