Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更新Tkinter画布上的图像?_Python_Tkinter - Fatal编程技术网

Python 如何更新Tkinter画布上的图像?

Python 如何更新Tkinter画布上的图像?,python,tkinter,Python,Tkinter,我正在尝试制作一个脚本,使我能够动态更新图像对象,然后将更新后的图像发布到Tkinter画布小部件。这里的代码是原型代码,只是为了了解基本情况。这里的目的是在画布显示的图像上单击位置放置一个蓝色像素 这里发生了一些非常奇怪的事情。我使用的是Wing IDE,如果我通过调试器运行这段代码,在woohoo函数的任何一行都有一个断点,然后在命中断点后继续执行,代码就会完全按照预期的那样工作——在图像上放置一个蓝色像素。如果我正常运行代码,或者通过没有断点的调试器运行代码,则映像永远不会更新。这让我得出

我正在尝试制作一个脚本,使我能够动态更新图像对象,然后将更新后的图像发布到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()
从Tkinter导入*
从PIL导入图像,ImageTk
def woohoo(事件):
原始像素((事件x,事件y),(0,0255))
newpic=ImageTk.PhotoImage(原始)
c、 创建_image((0,0),image=newpic,anchor=“nw”)
main=Tk()
c=画布(主视图,宽度=300,高度=300)
主要几何图形(“300x300+0+0”)
c、 包()
原始=Image.open(“asc.bmp”)
picture=ImageTk.PhotoImage(原件)
c、 创建图片((0,0),图片=图片,锚点=“nw”)
c、 绑定(“,呜呜)
main.mainloop()

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

如下所示:

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()
从Tkinter导入*
从PIL导入图像,ImageTk
def woohoo(事件):
全球图片#
原始像素((事件x,事件y),(0,0255))
picture=ImageTk.PhotoImage(原件)#
c、 itemconfigure(myimg,image=picture)#
main=Tk()
c=画布(主视图,宽度=300,高度=300)
主要几何图形(“300x300+0+0”)
c、 包()
原始=Image.open(“asc.bmp”)
picture=ImageTk.PhotoImage(原件)
myimg=c.create_image((0,0),image=picture,anchor=“nw”)#
c、 绑定(“,呜呜)
main.mainloop()

对另一篇文章做了一点修改,以使用Python 3+:

从tkinter导入*
def材料(事件):
全球图片3
picture3=PhotoImage(文件='picture2.png')
c、 itemconfigure(图2,图3)
main=Tk()
c=画布(主视图,宽度=300,高度=300)
c、 包()
picture=PhotoImage(文件='picture1.png')
图片2=c.创建图片(150150,图片=图片)
c、 绑定(“,东西)

main.mainloop()。仅仅复制和粘贴代码并不能帮助任何人学习。我觉得犯了那个错误真的很愚蠢。我习惯于从每个项目中创建对象,成员基本上具有全局范围,所以这可能就是它所做的。我有点惊讶,现在我知道问题出在哪里了,它一进入woohoo就没有崩溃,因为在分配任务之前应该引用原始版本。哦,如果我告诉python newpic是一个全局函数,那么代码工作得非常好。谢谢你的帮助:)