有没有什么方法可以在 tkinter 中从 PhotoImage 打印图像名称而不在其他任何地方存储图像名称?

问题描述 投票:0回答:2

我正在尝试打印图像名称作为 tkinter 照片按钮的输出。主要是不将图像文件名存储在其他任何地方。寻找一种直接从 PhotoImage 中选择图像文件名的方法。

我正在尝试的代码:

from tkinter import *
from PIL import Image, ImageTk

def clicked(square):
    name = square.image_name
    print(name)

root = Tk()

white = "#f2f2f2"
black = "#555555"

# Create button with image
photo = ImageTk.PhotoImage(Image.open("pawn_black.png").resize((50, 50), Image.LANCZOS))
a7_button = Button(root, bg=black, image=photo, command=lambda:clicked(a7_button))
a7_button.image = photo
a7_button.place(x=20,y=80)

root.mainloop()
  • 我得到的输出:
    pyimage1
  • 我期待的输出:
    pawn_black.png

这样存储有效:

a7_button.image_name = "pawn_black.png"

但是,我想要一种通过某种方式直接从此链接

Image.open("pawn_black.png")
中选择文件名的方法。我正在搜索这个以将棋子图像从一个盒子更新到另一个盒子以获取其当前盒子图像。

python python-3.x tkinter python-imaging-library chess
2个回答
0
投票

您可以使用 functools.partial 包装函数,以便在调用该函数之前提供参数。

如果重新定义

clicked
如下:

def clicked(file_name):
    print(file_name)

然后你可以这样定义按钮:

a7_button = Button(root, bg=black, image=photo, command=partial(clicked, 'pawn_black.png'))

无法从

ImageTk.PhotoImage
本身获取文件名。
PhotoImage
类不存储对用于初始化它的 PIL
Image
对象的引用。


0
投票

没有什么能阻止您动态地向对象添加新的成员变量(例如包含文件名)。

#!/usr/bin/env python3
from tkinter import *
from PIL import Image, ImageTk

def clicked(square):
    name = square.sourceFilename
    print(name)

root = Tk()

white = "#f2f2f2"
black = "#555555"

# Create button with image
filename = "pawn_black.png"
photo = ImageTk.PhotoImage(Image.open(filename).resize((50, 50), Image.LANCZOS))
a7_button = Button(root, bg=black, image=photo, command=lambda:clicked(a7_button))
a7_button.image = photo
a7_button.sourceFilename = filename       <--- HERE
a7_button.place(x=20,y=80)

root.mainloop()

也许你的意思是:

im = Image.open('pawn_black.png')
print(im.filename)
© www.soinside.com 2019 - 2024. All rights reserved.