用户点击后关闭图像(Python和Pillow)

时间:2017-12-01 18:25:38

标签: python image tkinter tkinter-canvas

我正在使用Python选择你自己的冒险游戏。我经常要给用户一个场景,并允许在该场景中找到对象。无论他们发现什么都可以放入他们的库存中,只要他们准备停止寻找物品,他们就可以点击左下方的“退出”按钮。但是,我遇到了一些错误,实际上是通过按钮点击坐标来实际执行某些操作。

到目前为止,我有这个:

root = Tk()
imageIQ1 = Canvas(root, width=1000, height=1000)
imageIQ1.pack()
original = Image.open("prison.jpg")
original = original.resize((1000,1000)) #resize image
img = ImageTk.PhotoImage(original)
imageIQ1.create_image(0, 0, image=img, anchor="nw")

def getcoors(eventcoors):
    global x0,y0
    x0 = evencoors.x
    y0 = evencoors.y
    print(x0,y0)

用户点击某组坐标(或其附近的某个位置)后,我希望程序从屏幕上清除图片并继续执行该程序。对于insance,点击从(300,400)到(500,500)的任何地方都会关闭图片并继续执行其余程序。我知道这将使用某种形式的循环,如

while (x not in range) and (y not in range):

但我不确定我将采取什么措施来清除图像。我读过关于使用像.kill()和.terminate()这样的东西,但它们在这种情况下不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您需要有一个图像参考,以便以后能够删除它:

canvImg = imageIQ1.create_image(0, 0, image=img, anchor="nw")

然后当你打电话:

imageIQ1.delete(canvImg)

它会被删除。

基于this,你可以将它放在一个事件方法中:

def motion(event):
    x, y = event.x, event.y

    someSpecificX = 142
    someSpecificY = 53
    marginX = 100
    marginY = 100
    print(x, y)

    if x in range(someSpecificX - marginX, someSpecificX + marginX):
        if y in range(someSpecificY - marginY, someSpecificY + marginY):
            imageIQ1.delete(canvImg)

imageIQ1.bind('<Button-1>', motion)

您的最终代码应如下所示:

from tkinter import *
from PIL import ImageTk, Image

root = Tk()
imageIQ1 = Canvas(root, width=1000, height=1000)
imageIQ1.pack()
original = Image.open("prison.jpg")
original = original.resize((1000,1000)) #resize image
img = ImageTk.PhotoImage(original)
canvImg = imageIQ1.create_image(0, 0, image=img, anchor="nw")

def motion(event):
    x, y = event.x, event.y

    someSpecificX = 142
    someSpecificY = 53
    marginX = 100
    marginY = 100
    print(x, y)

    if x in range(someSpecificX - marginX, someSpecificX + marginX):
        if y in range(someSpecificY - marginY, someSpecificY + marginY):
            imageIQ1.delete(canvImg)


imageIQ1.bind('<Button-1>', motion)

root.mainloop()