2016-07-13 8 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

initはデータvarをランダムに初期化しないようにしました。このコードは毎秒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

Argh!それはタイプミスです。私は "あなた**はおそらくちょうど再設定することができます..."と言っていたのです。私は「なぜあなたはできないのですか」と書いてから、それを変更したと思います。 Mea culpa。メモリリークは小さくなりますが、存在します。ガベージコレクタはイメージのメモリを扱いますが、 'create_image'を呼び出すたびに、基になるtcl/tkコードは決して破壊されない新しいキャンバスオブジェクトを作成します。 –

関連する問題