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))