Значок окна установки
Когда я попытался изменить значок окна в левом верхнем углу от уродливого красного "TK" до моего собственного значка с помощью приведенного ниже кода, Python сделал ошибку:
from tkinter import *
root = Tk()
#some buttons, widgets, a lot of stuff
root.iconbitmap('favicon.ico')
Это означает, что значок должен быть "favicon.ico" (согласно большому количеству сообщений в форумах по всему Интернету). Но, к сожалению, вся эта строка выводит следующую ошибку:
Traceback (most recent call last):
File "d:\ladvclient\mainapp.py", line 85, in <module>
root.iconbitmap(bitmap='favicon.ico')
File "C:\Python33\lib\tkinter\__init__.py", line 1637, in wm_iconbitmap
return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: bitmap "favicon.ico" not defined
Что я уже сделал:
- Я проверил путь - все на 100% правильно
- Я пробовал другие форматы файлов, такие как
.png
или .bmp
- никто не работал
- Я рассмотрел эту проблему на многих веб-сайтах.
И для третьего пункта, effbot.org, мой любимый сайт о Tkinter, сказал мне, что Windows игнорирует функцию iconbitmap
.
Но это не объясняет, почему это порождает ошибку!
Есть некоторые "хакерские" способы избежать этой проблемы, но ни один из них не написан для Python 3.x.
Итак, мой последний вопрос: есть ли способ получить пользовательский значок с помощью Python 3.x и Tkinter?
Кроме того, не говорите мне, что я должен использовать другую библиотеку графического интерфейса. Я хочу, чтобы моя программа работала на каждой платформе. Я также хочу кодированную версию, а не решение py2exe
или sth
.
Ответы
Ответ 1
У вас не должно быть favicon.ico
в той же папке, что и ваш script или, а именно, на вашем пути. Поместите полный путь. Например, это работает:
from tkinter import *
root = Tk()
root.iconbitmap(r'c:\Python32\DLLs\py.ico')
root.mainloop()
Но это взрывается с той же ошибкой:
from tkinter import *
root = Tk()
root.iconbitmap('py.ico')
root.mainloop()
Ответ 2
Никоим образом не работает то, что здесь предлагается - ошибка "bitmap xxx not defined" всегда присутствует. И да, я установил правильный путь к нему.
Что он сделал, это:
imgicon = PhotoImage(file=os.path.join(sp,'myicon.gif'))
root.tk.call('wm', 'iconphoto', root._w, imgicon)
где sp
- путь script, а root
- корневое окно Tk.
Трудно понять, как это работает (я бесстыдно скопировал его из fedoraforums), но он работает
Ответ 3
Это работает для меня с Python3 на Linux:
import tkinter as tk
# Create Tk window
root = tk.Tk()
# Add icon from GIF file where my GIF is called 'icon.gif' and
# is in the same directory as this .py file
root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='icon.gif'))
Ответ 4
#!/usr/bin/env python
import tkinter as tk
class AppName(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.grid()
self.createWidgets()
def createWidgets(self):
self.quitButton = tk.Button(self, text='Quit', command=self.quit)
self.quitButton.grid()
app = AppName()
app.master.title('Title here ...!')
app.master.iconbitmap('icon.ico')
app.mainloop()
он должен работать так!
Ответ 5
Оба кода работают со мной на Python 3.7..... надеюсь, у вас тоже будет работать
import tkinter as tk
m=tk.Tk()
m.iconbitmap("myfavicon.ico")
m.title("SALAH Tutorials")
m.mainloop()
и не забудьте сохранить "myfavicon.ico" в той же папке, где находится файл сценария вашего проекта
Другой метод
from tkinter import *
m=Tk()
m.iconbitmap("myfavicon.ico")
m.title("SALAH Tutorials")
m.mainloop()
[* ПРИМЕЧАНИЕ: - Python версии 3 работает с Tkinter и ниже версии 3, т.е. версия 2 работает с Tkinter]
Ответ 6
Застрял на этом тоже...
Наконец удалось установить значок, который я хотел, используя следующий код:
from tkinter import *
root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png'))
Ответ 7
Убедитесь, что файл .ico также не поврежден. Я получил ту же ошибку, которая исчезла, когда я попробовал другой файл .ico.
Ответ 8
Таким образом, похоже, что root.iconbitmap()
поддерживает только фиксированный каталог.
sys.argv[0]
возвращает каталог, из которого был прочитан файл, поэтому простой код будет работать для создания фиксированного каталога.
import sys
def get_dir(src):
dir = sys.argv[0]
dir = dir.split('/')
dir.pop(-1)
dir = '/'.join(dir)
dir = dir+'/'+src
return dir
Это выход
>>> get_dir('test.txt')
'C:/Users/Josua/Desktop/test.txt'
РЕДАКТИРОВАТЬ:
Единственная проблема заключается в том, что этот метод не работает на Linux
[email protected]:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.argv[0]
''
>>>
Ответ 9
from tkinter import *
from PIL import ImageTk, Image
Tk.call('wm', 'iconphoto', Tk._w, ImageTk.PhotoImage(Image.open('./resources/favicon.ico')))
Вышесказанное сработало для меня.