0

I am fairly new to python and very new to GUI's so please let me know if I have made an obvious mistake.

This is also my first post so please let me know if I need to edit my question in some way.

I don't understand why I am getting errors when trying to set an icon to a tkinter GUI. I have already tried the following posts:

tkinter TclError: error reading bitmap file

https://www.delftstack.com/howto/python-tkinter/how-to-set-window-icon-in-tkinter/

There are other stack exhange posts on this topic but they are for windows and/or their OP's normally can get the icon to apear once then it doesn't work. This isn't my situation the programs fail to run. Though I have tried some of their suggestions as well.

I have tried three different ways of coding this: Method 1:

from tkinter import *
import os

class MainWindow:
    
    def __init__(self, master):
        self.master = master
        master.title('TD')
        #self.iconbitmap(default = 'fist.ico')

root = Tk()
root.iconphoto(True, PhotoImage(os.path.join(os.getcwd(),'favicon-3.png')))
my_gui = MainWindow(root)
root.mainloop()

Result:

runfile('~./envs/thermTD_project/thermTD/untitled2.py', wdir='~./envs/thermTD_project/thermTD')
Traceback (most recent call last):

  File "~./envs/thermTD_project/thermTD/untitled2.py", line 23, in <module>
    root.iconphoto(True, PhotoImage(os.path.join(os.getcwd(),'favicon-3.png')))

  File "/usr/lib/python3.8/tkinter/__init__.py", line 2116, in wm_iconphoto
    self.tk.call('wm', 'iconphoto', self._w, "-default", *args)

TclError: can't use "~./envs/thermTD_project/thermTD/favicon-3.png" as iconphoto: not a photo image

File existence check:

In [42]: os.path.exists(os.path.join(os.getcwd(),'favicon-3.png'))
Out[42]: True

Method 2:

from tkinter import *
import os

class MainWindow:
    
    def __init__(self, master):
        self.master = master
        master.title('TD')
        #self.iconbitmap(default = 'fist.ico')

root = Tk()

root.iconbitmap(os.path.join(os.getcwd(),'favicon-3.ico'))
my_gui = MainWindow(root)
root.mainloop()

Result:

In [43]: runfile('~./envs/thermTD_project/thermTD/untitled2.py', wdir='~./envs/thermTD_project/thermTD')
Traceback (most recent call last):

  File "~./envs/thermTD_project/thermTD/untitled2.py", line 22, in <module>
    root.iconbitmap(os.path.join(os.getcwd(),'favicon-3.ico'))

  File "/usr/lib/python3.8/tkinter/__init__.py", line 2071, in wm_iconbitmap
    return self.tk.call('wm', 'iconbitmap', self._w, bitmap)

TclError: bitmap "~./envs/thermTD_project/thermTD/favicon-3.ico" not defined

File existence check:

In [44]: os.path.exists(os.path.join(os.getcwd(),'favicon-3.ico'))
Out[44]: True

Method 3:

from tkinter import *
import os

class MainWindow:
    
    def __init__(self, master):
        self.master = master
        master.title('TD')
        #self.iconbitmap(default = 'fist.ico')

root = Tk()
img = PhotoImage(os.path.join(os.getcwd(),'favicon-3.ico'))
root.tk.call('wm','iconphoto', root._w, img)
my_gui = MainWindow(root)
root.mainloop()

Result:

In [45]: runfile('~./envs/thermTD_project/thermTD/untitled2.py', wdir='~./envs/thermTD_project/thermTD')
Traceback (most recent call last):

  File "~./envs/thermTD_project/thermTD/untitled2.py", line 21, in <module>
    root.tk.call('wm','iconphoto', root._w, img)

TclError: can't use "~./envs/thermTD_project/thermTD/favicon-3.ico" as iconphoto: not a photo image

File existence check: See method 1

The code without any of the icon setting lines works as expected.

I have tried to gif, png and ico on each method. I am trying other file types now.

NB: While the filename is favicon actually they are ico, gif, png files of 64x64 pixles. Even the favicon ico only has 1 type of icon in it (if thats the right phrase). Its just I got them from a favicon which I converted to different formats using mogrify.

OS: Ubuntu 20.04.1 LTS python 3.8.2 IDE: spyder 4.1.5

P.S. I would be gratefull to know what the syntax for including this in my init function. I am trying to do object orientated GUI's I am very much still learning.

boz_eng
  • 1
  • 2
  • Have you tried using a ico as an icon, only those are supported via the `iconbitmap()` method, and otherwise with png, take a look [here](https://www.geeksforgeeks.org/iconphoto-method-in-tkinter-python/) – Delrius Euphoria Oct 02 '20 at 14:21
  • Yeah, I've just tried that I get [TclError: bitmap "~./envs/thermTD_project/thermTD/favicon-3.ico" not defined]. I've been double checking after posting that each of the file types for each of the methods aren't working for me. Now onto bmp... Thanks for the comment though. – boz_eng Oct 02 '20 at 14:26
  • Are you using a file converter to change the file from one extension to another? Renaming file will just make it corrupted – Delrius Euphoria Oct 02 '20 at 14:28
  • 1
    yeah I am using mogrify on ubuntu to switch formats. I can open each of the files I am loading in the Image Viewer of Ubuntu so I don't think their corrupted. – boz_eng Oct 02 '20 at 14:31
  • `PhotoImage(...)` should be `PhotoImage(file=...)`. – acw1668 Oct 02 '20 at 15:56
  • @acw1668 Thank you very much! that works perfectly now. I feel a bit stupid but at least it works. – boz_eng Oct 03 '20 at 06:26

0 Answers0