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 に答える