2012-06-27 27 views
2

我試圖做一個腳本,這將使我能夠動態更新圖像對象,然後將更新後的圖像發佈到Tkinter Canvas窗口小部件。這裏的代碼是原型代碼,只是爲了瞭解基礎知識。這裏的目標是在點擊位置處在畫布上顯示的圖像上放置一個藍色像素。如何更新Tkinter畫布上的圖像?

在這裏發生了一件非常奇怪的事情。我正在使用Wing IDE,如果我通過調試器運行此代碼,並在 woohoo函數中的任意行處有斷點,然後在達到斷點後繼續執行,則代碼將按預期工作 - 將藍色圖像上的像素。如果我正常運行代碼,或者通過沒有斷點的調試器,圖像從不更新。這使我得出這樣的結論,即有一些內在的巫術正在進行,如果沒有援助,我沒有太多的理解的希望。

我真的很想知道最好的方式去做這件事(或者我猜),如果有人能向我解釋發生了什麼事情,那真的很酷。謝謝。

from Tkinter import * 
from PIL import Image, ImageTk 

def woohoo(event): 

    original.putpixel((event.x,event.y),(0,0,255)) 

    newpic = ImageTk.PhotoImage(original) 
    c.create_image((0,0),image=newpic, anchor="nw") 


main = Tk() 
c = Canvas(main, width=300, height=300) 
main.geometry("300x300+0+0") 
c.pack() 

original = Image.open("asc.bmp") 
picture = ImageTk.PhotoImage(original) 
c.create_image((0,0),image=picture, anchor="nw") 

c.bind("<Button-1>", woohoo) 

main.mainloop() 

回答

3

我的猜測是,你正在一個函數中創建一個新的圖像。對圖像的引用是局部變量。當函數退出時,引用被垃圾收集,導致新圖像被銷燬。最有可能的,交互式運行導致垃圾收集器運行不同

+0

我覺得犯那個錯誤很愚蠢。我習慣於從每個項目中創建對象,其成員基本上具有幾乎全球範圍,所以這可能是什麼。我有點驚訝,現在我知道問題出在哪裏,它一進入_woohoo_就沒有崩潰,因爲**原始**應該在賦值之前被引用。噢,如果我告訴python ** newpic **是一個全局的代碼,那麼代碼完美工作。感謝您的幫助:) – tyotypic

0

嘗試這樣的(也許更懶洋洋地?):

from Tkinter import * 
from PIL import Image, ImageTk 

def woohoo(event): 
    global picture # 
    original.putpixel((event.x,event.y),(0,0,255)) 

    picture = ImageTk.PhotoImage(original)# 

    c.itemconfigure(myimg, image=picture)# 


main = Tk() 
c = Canvas(main, width=300, height=300) 
main.geometry("300x300+0+0") 
c.pack() 

original = Image.open("asc.bmp") 
picture = ImageTk.PhotoImage(original) 
myimg = c.create_image((0,0),image=picture, anchor="nw")# 

c.bind("<Button-1>", woohoo) 

main.mainloop() 
+4

這將有助於添加一點verbage解釋你改變了什麼。只是複製和粘貼代碼不會幫助任何人學習。 –

0

變化不大的其他職位的使用Python 3+工作:

from tkinter import * 
 

 
def stuff(event): 
 
    global picture3 
 
    picture3 = PhotoImage(file='picture2.png') 
 
    c.itemconfigure(picture2, image = picture3) 
 

 
main = Tk() 
 
c = Canvas(main, width=300, height=300) 
 
c.pack() 
 

 
picture = PhotoImage(file='picture1.png') 
 
picture2 = c.create_image(150,150,image=picture) 
 

 
c.bind("<Button-1>", stuff) 
 

 
main.mainloop()