Python: назначение значков битов Tkinter работает только на уровне модуля - PullRequest
0 голосов
/ 20 апреля 2019

Я использую окно tkinter.ttk, и я использую значок, чтобы установить битовую карту моего окна. Однако 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) он не работал (и это была та же функция). Кто-нибудь знает, почему это не работает и что я могу сделать, чтобы избежать ошибки? Заранее спасибо ...

1 Ответ

1 голос
/ 20 апреля 2019

Если у вас уже открылось окно и вы хотите открыть еще одно с собственным значком, вам следует использовать 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()
...