我正在尝试打印图像名称作为 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")
中选择文件名的方法。我正在搜索这个以将棋子图像从一个盒子更新到另一个盒子以获取其当前盒子图像。
您可以使用 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
对象的引用。
没有什么能阻止您动态地向对象添加新的成员变量(例如包含文件名)。
#!/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)