【问题标题】:How do I make a clickable image that gives me the coordinates of the click?如何制作一个可点击的图像,给我点击的坐标?
【发布时间】:2021-01-09 03:47:36
【问题描述】:

我正在尝试使用 tkinter 模块制作类似幻灯片的程序。这是我所做的:

from tkinter import *

root = Tk()


photo = PhotoImage(file = "image.jpeg")
w = Label(root, image=photo)
w.pack()

def callback(event):
    print ("clicked at", event.x, event.y)

##canvas= Canvas(root, width=800, height=500)
canvas= Canvas(root)
canvas.bind("<Button-1>", callback)
canvas.pack()

root.mainloop()

发生了什么:
我正在画布上放一张图片。
我还在检测左键单击并获取坐标(打印在外壳上)

但真正发生了什么:

图片(需要与脚本在同一个文件夹中,顺便说一句)出现在顶部,下面出现一个小空白,我可以单击它(并获取单击的坐标)。如果我点击图片,什么都不会发生。当我点击空白区域时,它只给出空白区域的点击坐标,不将图片算作区域的一部分。如果我放大窗口,它只会在侧面添加惰性空白区域,不会对点击做出反应。

我的问题是,如何让图片成为可点击的部分(也就是获取坐标),并去掉空格

如果你能把图片用窗口放大,那就更好了。

Python 3.7.3,在 MacBook 上。我只有标准库。

【问题讨论】:

  • 您将图像放在标签上而不是画布上。
  • 您需要将点击绑定到Label本身,使用:w.bind("&lt;Button-1&gt;", callback)

标签: python macos image tkinter


【解决方案1】:

您不需要画布,而是应该绑定在标签上。注意tkinter.PhotoImage()不支持JPEG图片,使用PNG或者使用Pillow模块代替。

from tkinter import *
from PIL import ImageTk

root = Tk()

photo = ImageTk.PhotoImage(file="image.jpeg")
w = Label(root, image=photo)
w.pack()

def callback(event):
    print ("clicked at", event.x, event.y)

w.bind("<Button-1>", callback)

root.mainloop()

【讨论】:

  • 我没有 PIL 或枕头(我可能应该得到它),并且 tkinter.PhotoImage() 在使用 JPEG 图像时对我有用。
  • 我想知道为什么我无法让 jpg 在我的系统上工作...
  • 这意味着该图像实际上不是 JPEG 图像,而是具有.jpeg 文件扩展名。使用file image.jpeg(macos 有file 命令吗?)检查它的真实格式。
  • 如果您右键单击图像文件,则会出现“获取信息”选项。它会打开一个小窗口,其中包含文件信息。里面有一行写着:种类:JPEG。如果我真的不应该能够使用 JPEG 图像,那么,我不确定它为什么会起作用,但确实如此。
【解决方案2】:

您实际上并没有将图像放置在画布上。要将图像放在画布上,请使用 .create_image()。将图像大小调整为画布。你可以使用PIL库提供的resize方法。

from tkinter import *
from PIL import ImageTk, Image

def resize_event(event):
    resized = ImageTk.PhotoImage(img.resize((event.width, event.height), resample = Image.NEAREST))
    canvas.itemconfig(img_item, image=resized)
    canvas.moveto(img_item, 0, 0)
    canvas.image = resized
    
def callback(event):
    print ("clicked at", event.x, event.y)
     

root = Tk()

img = Image.open(r"Imagepath")
photo = ImageTk.PhotoImage(img)
#w = Label(root, image=photo)
#w.pack()

##canvas= Canvas(root, width=800, height=500)
canvas= Canvas(root)
img_item = canvas.create_image(0, 0, image = photo)
canvas.bind("<Button-1>", callback)
canvas.bind('<Configure>', resize_event)
canvas.pack(expand=True, fill='both')

root.mainloop()

【讨论】:

  • 我没有 PIL。也许它应该是标准库的一部分,但我尝试导入但没有用。
  • @AidanTung pip install Pillow
  • pip 对我不起作用,我之前尝试过。在 shell 和脚本中,它都说“语法错误”,仅此而已。
  • @AidanTung 从命令提示符或终端运行它,而不是从 shell 或脚本。
  • 命令提示符是带“>>>”的窗口吗?我也使用了这个,但是去掉了需要 PIL 的部分,它可以部分工作。只有大约四分之一加载在 tkinter 窗口上。窗口大小合适,我从窗口上的任何位置获取坐标,但只有部分图片在那里;剩下的就是空白
猜你喜欢
  • 2021-07-02
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 2023-03-05
  • 2022-11-03
  • 2014-05-29
相关资源
最近更新 更多