我正在尝试创建一个脚本,使我能够动态更新图像对象,然后将更新后的图像发布到Tkinter Canvas小部件。这里的代码是原型代码,只是为了让基础知识失效。这里的目的是在点击位置为画布显示的图像上放置一个蓝色像素。
这里发生了一件非常奇怪的事。我正在使用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()
答案 0 :(得分:3)
我的猜测是,你在一个函数中创建一个新图像。对图像的引用是局部变量。当函数退出时,引用被垃圾收集,导致新图像被破坏。最有可能的是,以交互方式运行会导致垃圾收集器以不同的方式运行(可能更懒惰?)
答案 1 :(得分:1)
尝试这样:
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()
答案 2 :(得分: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()
&#13;