2016-07-13 33 views
-1

我想更改数据,只是将某些像素切换为白色或黑色,但我没有得到它的工作,我可以更改数据?当我使用行np.roll()时,它会滚动图像并更新它,但是当我使用任何其他方法简单地更改数据数组的值时,我失败了?Tkinter更改数据

我该怎么做,我错了什么?

import Tkinter 
from PIL import Image, ImageTk 
import numpy 
import time 

times=1 
timestart=time.clock() 
data=numpy.array(numpy.random.random((68,68))*100,dtype=int) 
#data = numpy.zeros([68,68]) 
photo = None 
sw = 1 

def image_loop(): 
     global data 
     global times 
     global timestart 
     global photo 

     im=Image.fromstring('L', (data.shape[1],data.shape[0]), data.astype('b').tostring()) 
     photo = ImageTk.PhotoImage(image=im) 
     canvas.create_image(0,0,image=photo,anchor=Tkinter.NW) 
     root.update() 
     times+=1 
     if times%33==0: 
       print "%.02f FPS"%(times/(time.clock()-timestart)) 

     root.after(100,image_loop) 
     ### THE next line WORKS, why not the others ??????? 
     #data=numpy.roll(data,-1,1) 


     ### Does not work ?? 
     global sw 
     if sw == 0: 
       for i in range(68): 
         data[10][i] * 100 
         #data = numpy.array(numpy.zeros(68,68)) 
       sw = 1 
       print "hi" 
     else: 
       sw = 0 
       for i in range(68): 
         data[10][i]/100 
         data = numpy.array(numpy.ones(68,68)) 
         #data = data * 100 
       print "ho" 



root = Tkinter.Tk() 
frame = Tkinter.Frame(root, width=68, height=68) 
frame.pack() 
canvas = Tkinter.Canvas(frame, width=68,height=68) 
canvas.place(x=-2,y=-2) 

root.after(0,image_loop) # INCREASE THE 0 TO SLOW IT DOWN 
#root.mainloop() 

while True: 
     print "do work again and again, change data" 
     root.update() 
     root.update_idletasks() 


     print data.shape 
+0

为什么我在这里投票? –

回答

2

事情是在初始化时不随机地初始化数据变量。此代码适用于95帧每秒

import Tkinter 
from PIL import Image, ImageTk 
import numpy 
import time 

times=1 
timestart=time.clock() 
data = None 
photo = None 

sw = 1 

def image_loop(): 
     global data 
     global times 
     global timestart 
     global photo 

     im=Image.fromstring('L', (data.shape[1],data.shape[0]), data.astype('b').tostring()) 
     photo = ImageTk.PhotoImage(image=im) 
     canvas.create_image(0,0,image=photo,anchor=Tkinter.NW) 
     root.update() 
     times+=1 
     if times%33==0: 
       print "%.02f FPS"%(times/(time.clock()-timestart)) 

     root.after(10,image_loop) 



root = Tkinter.Tk() 
frame = Tkinter.Frame(root, width=68, height=68) 
frame.pack() 
canvas = Tkinter.Canvas(frame, width=68,height=68) 
canvas.place(x=-2,y=-2) 

root.after(0,image_loop) 

data=numpy.array(numpy.random.random((68,68))*100,dtype=int) 


while True: 
     #print "do work again and again, change data" 
     root.update() 
     root.update_idletasks() 

     global sw 
     if sw == 0: 
       for i in range(68): 
         data[10][i] = 250 
       sw = 1 
     else: 
       sw = 0 
       for i in range(68): 
         data[10][i] = 0 
"plot.py" 58L, 1190C                                          1,1   Top 
+0

而不是在循环中调用'create_image',你可能不会重新配置一个现有的画布图像对象。正如你所写的,你有一点内存泄漏,因为你在画布上每秒创建100个图像对象,并且永远不会破坏旧图像对象。创建几千张图像后,画布可能会出现性能问题。否则,这是一个很好的解决方案! –

+0

嗨@BryanOakley你是什么意思,用“你不能重新配置现有的画布”?我不创建100个图像,它是一个68x68的数组,并且数组的值与100相乘,以在图像中看到像素为白色。现在我用超过1亿张图片运行此代码,并且没有增加内存。我不摧毁旧的,我简单地覆盖它 –

+0

唉!这是一个错字。我的意思是说“你**可能**只是重新配置......”。我想我开始写“为什么你不能......”,然后改变它。 Mea culpa。内存泄漏会很小,但它存在。垃圾收集器处理图像的内存ok,但每次调用'create_image'时,底层的tcl/tk代码都会创建一个永不会被破坏的新画布对象。 –