Python 从tkinter标签获取照片图像对象

Python 从tkinter标签获取照片图像对象,python,image,user-interface,tkinter,Python,Image,User Interface,Tkinter,有没有办法从tkinter.Label实例获取tkinter.PhotoImage对象?我知道有,这有一个部分令人满意的答案,但我真的需要得到一个PhotoImage对象: >>> import tkinter as tk >>> >>> root = tk.Tk() >>> >>> image1 = tk.PhotoImage(file="img.gif") >>> image2 = t

有没有办法从
tkinter.Label
实例获取
tkinter.PhotoImage
对象?我知道有,这有一个部分令人满意的答案,但我真的需要得到一个
PhotoImage
对象:

>>> import tkinter as tk
>>>
>>> root = tk.Tk()
>>>
>>> image1 = tk.PhotoImage(file="img.gif")
>>> image2 = tk.PhotoImage(file="img.gif")
>>>
>>> label = tk.Label(root, image=image1)
>>> label._image_ref = image1
>>> label.cget("image") == image2
False
是否有一个函数允许我从
pyimage
字符串中获取图像对象?即从
label.cget(“图像”)
中获取的图像


答案是,你不能。最接近的方法是获取图像源(文件或数据)并检查(可能通过哈希)两个图像是否相同
tkinter.PhotoImage
不实现
\uuuuu eq\uuuu
,因此不能仅比较两个图像以获得相同的数据。下面是解决问题的最后一个示例(主要是):


正如
tkinter
tk
的包装器一样,
PhotoImage
也是同样的包装器。很明显,你不能只是向后移动,然后从
图像创建
照片图像

但是,由于您可以执行tk命令,并且
PhotoImage
image
具有类似的结构,因此您最好的选择是这样的:

import tkinter as tk

root = tk.Tk()

image1 = tk.PhotoImage(file="img.gif")
image2 = tk.PhotoImage(file="img.gif")

label = tk.Label(root, image=image1)
label._image_ref = image1

foo = root.call(label.cget('image'), 'cget', '-file')
bar = image2['file']
print('1st image:\t%s\n2nd image:\t%s\nEqual:\t%r' % (foo, bar, foo == bar))

您将其存储为
标签。\u image\u ref
,不是吗?因此,链接的答案应用为
标签。\u image\u ref.cget('file')
。但是为什么你声称这是一个部分令人满意的结果呢?在您的情况下,相等总是
False
,因为它与
image1==image2
是一样的(
PhotoImage
没有
\uuuuueq\uuuuu
方法)。我不能假设人们会保留对图像的引用。我不明白为什么
PhotoImage
\uuuuueq\uuuuu
实现没有处理视觉相似性,但这是另一个问题。
PhotoImage
对象没有定义
\uuueq\uuu
方法,因此它们继承了默认方法,这意味着执行
image1==image2
相当于
image1是image2
,因此它将返回False,因为它们不是同一个对象,即使它们包含相同的图像数据。好吧,这很可笑,但我希望能够绕过这个问题。@Coal\uz,
>我不能假设人们会保留对该图像的引用。
。为什么你不能?我可能错了,但这是必须的,因为任何人都应该保留一份推荐信。我知道你是从哪里来的。如果我像这样实现它,我可能会打开文件并散列数据,以确保它们的内容相同。同样,这是一个非常脆弱的解决方案(特别是因为
PhotoImage
也可以从图像字节初始化)。如果我找不到更好的解决办法,我就用这个。谢谢,这不是问题,因为它是一个包装器,所以
image
也可以用这种方式初始化。如果它来自字节,则检查
数据
是否相等!此外,您还可以动态确定它是从哪个源初始化的@但是,如果是这样,相同的文件可以通过不同的路径初始化,这是一个问题。但正如@PM 2Ring提到的,
tkinter不是一个图像处理库,所以在这种情况下,即使你有一对
PhotoImage
s或一对
image
s,你也无能为力。你能给我指一下
根目录上的一些文档吗?调用
或至少调用
-file
标志?我似乎在任何地方都找不到。@Coal,当然,
call
描述得很好。而
-file
是一个选项,就像
image2['file']
一样。按照我的答案中的第二个链接(或使用链接)。
import tkinter as tk

root = tk.Tk()

image1 = tk.PhotoImage(file="img.gif")
image2 = tk.PhotoImage(file="img.gif")

label = tk.Label(root, image=image1)
label._image_ref = image1

foo = root.call(label.cget('image'), 'cget', '-file')
bar = image2['file']
print('1st image:\t%s\n2nd image:\t%s\nEqual:\t%r' % (foo, bar, foo == bar))