我想知道是否有办法在不知道图标位置的情况下获取一个窗口的ico文件并在同一窗口中使用它。
from tkinter import *
root = Tk()
root.iconbitmap('img/icn.ico')
top = Toplevel()
root.mainloop()
在这里,我希望top
有root
的图标,而不说top.iconbitmap()
或top.iconphoto()
,我得到的最接近的是top.tk.call('wm','iconbitmap')
,但我不知道该怎么办,因为我找不到可以理解的文档。
为什么我不想使用iconbitmap()
呢?基本上,使用tkinter.messagebox
,您可以看到消息框自动继承父窗口小部件的图标。我试图复制这种效果。如果图标是默认的tk图标,则显示空白图标或显示自定义图标。
提前感谢:D
[我在这里使用到核心Tk文档的链接。它在大多数方面都比Tkinter文档准确得多,而Tkinter主要是一个明显的薄包装。]
你不想要wm iconbitmap
。这实际上已经过时了几十年;它使用了一个对象类bitmap
,这个类现在已经不相关了,因为它是单色的,并且使用了最奇怪的格式。(文件名前面需要加上@
才能正常工作。(
相反,您希望操作相关顶层窗口的wm iconphoto
。这些可以拍摄真实的照片图像(有许多图像文件格式可以加载到其中(,并且可以轻松共享。
# Load the image from the file; can also use PNG and other formats
my_image = PhotoImage(file="image.gif")
# Apply the image as the icons
first_toplevel_window.iconphoto(False, my_image)
second_toplevel_window.iconphoto(False, my_image)
请注意,图标的显示方式可能会有很大差异;它不在你的控制之下。
您可以使用iconphoto()
并将第一个参数设置为True
,然后相同的图标也将用于未来创建的顶层:
import tkinter as tk
root = tk.Tk()
icn = tk.PhotoImage(file='my-icon.png')
root.iconphoto(True, icn)
top = tk.Toplevel(root)
root.mainloop()
如果使用default
而不是bitmap
(或第一个(参数,则图标将自动用于所有TopLevel
窗口:
root.iconbitmap('img/icn.ico') # icon set only on root
root.iconbitmap(bitmap='img/icn.ico') # same as above
root.iconbitmap(default='img/icn.ico') # icon set on root and all TopLevels