获取第二个窗口tkinter要使用的根窗口的图标



我想知道是否有办法在不知道图标位置的情况下获取一个窗口的ico文件并在同一窗口中使用它。

from tkinter import *
root = Tk()
root.iconbitmap('img/icn.ico')
top = Toplevel()
root.mainloop()

在这里,我希望toproot的图标,而不说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

最新更新