Python:Tkinter 图标位图分配仅适用于模块级别

Python: Tkinter iconbitmap assignment only works at module level

我正在使用 tkinter.ttk window 并且我正在使用一个图标来设置我的 window 的图标位图。但是 root.iconbitmap() 在 Windows 10 上被忽略了。但是有一个简单的方法可以避免错误:root.tkinter.call('wm', 'iconphoto', root._w, icon)

所以:

from tkinter import *
from tkinter.ttk import *

root=Tk()
root.call('wm', 'iconphoto', root._w, icon)

有效。 但是:

def func():
    root=Tk()
    root.call('wm', 'iconphoto', root._w, icon)

有效。发生错误。有趣的是,该错误与您使用 root.iconbitmap():

时发生的错误完全相同
Traceback (most recent call last):
File "E:\test.py", line 95, in <module>
func()
File "E:\test.py", line 36, in func
t.call('wm', 'iconphoto', t._w, icon)
_tkinter.TclError: can't use "pyimagex" as iconphoto: not a photo Image

还有一个有趣的事实:在另一个文件中,我也尝试将它用作函数,它起作用了。在新文件 (test.py) 中,它不起作用(而且功能相同)。 有谁知道为什么它不起作用以及我可以做些什么来避免错误?提前致谢...

如果您已经打开了一个 window 并想打开另一个有自己图标的,那么您应该使用 Toplevel() 而不是 Tk() 并更改图标使用

W2 = Toplevel()
icon = PhotoImage(file='icon.png')
W2.tk.call('wm', 'iconphoto', root._w, icon)

示例:

from tkinter import *
from tkinter.ttk import *

def test():
    root = Toplevel()
    icon = PhotoImage( file='icon.png' )  # path to the icon
    root.tk.call('wm', 'iconphoto', root._w, icon)

r = Tk()

b =  Button(r, text='press', command=test)
b.pack()

mainloop()