3

我正在尝试制作一个脚本,使我能够动态更新图像对象,然后将更新的图像发布到 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()
4

3 回答 3

3

我的猜测是,你正在一个函数中创建一个新图像。对图像的引用是一个局部变量。当函数退出时,引用被垃圾收集,导致新图像被破坏。最有可能的是,交互式运行会导致垃圾收集器以不同的方式运行(也许更懒惰?)

于 2012-06-27T11:12:35.190 回答
2

更改了其他帖子的一些内容以使用 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()

于 2015-03-29T19:57:16.690 回答
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()
于 2012-06-27T22:51:01.670 回答