6

I am trying to set an icon in my wxpython program. So far, after reading many pages and examples, I was able to set an icon at the window, which also works when using alt+tab (I'm working over Windows 7).

But the icon at task bar is the usual python default icon.

I don't understand why are there so many troubles for such a simple task.

Here is my code:

class GraphFrame(wx.Frame):
    """ The main frame of the application
    """
    title = 'My first wxprogram'

    def __init__(self):
        wx.Frame.__init__(self, None, -1, self.title)

        ico = wx.Icon('dog.ico', wx.BITMAP_TYPE_ICO)
        self.SetIcon(ico)
        self.set_icon  

        self.create_menu()
        self.create_status_bar()
        self.create_main_panel()
        #...
1

4 Answers 4

12

I have found a fix to the problem described in my second answer in another SO question/answer which is PyQt related. Add this code to your application before the GUI is created:

import ctypes
myappid = 'mycompany.myproduct.subproduct.version' # arbitrary string
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)

The icon will be set correctly with either taskbar buttons settings.

Explanation can be found here: https://stackoverflow.com/a/1552105/674475

Sign up to request clarification or add additional context in comments.

Comments

3

It should work as expected. I guess your problem is just the icon format. I am usually embedding icons in the code using img2py.py script included with wxPython. Here is a working example:

enter image description here

import wx
from wx.lib.embeddedimage import PyEmbeddedImage

plane = PyEmbeddedImage(
    "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")

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.SetIcon(plane.GetIcon())
        self.panel = wx.Panel(self)
        self.Show()

app = wx.App(False)
win = MainWindow(None)
app.MainLoop()

8 Comments

What version of Python and Windows? Running your code, the icon's not set - uses the Python app icon. (Windows x64, python 2.7.3). Also checked on a x86 computer, and the same behaviour - icon not set. (Same python and wx)
@TyrantWave - Interesting! I have never had any problems with this. Now I am starting to get curious. Maybe a bug in wxPython? Taskbar or windows effect settings? OS: Windows 7 32-bit, Python: 2.7.3, wxPython: 2.8.12.1.
Are you using Aero or not maybe? Perhaps non-Aero can override the icon, but with it enabled windows only takes the icon from the executable? I'm running the same python/wx, and both x86/x64 windows.
But I have most of the effects disabled, for example disabled Aero Peek.
Aha! I have found it! "Taskbar and Start Menu Properties / Taskbar / Taskbar buttons / Always combine and Hide labels". With labels shown it works.
|
3

Both TyrantWave's and mine answers are true under specific circumstances. It depends on Windows 7 settings:

Taskbar buttons settings

When labels are hidden, the icon does not seem to be set:

enter image description here

With labels shown it works just fine as expected:

enter image description here

Comments

2

It's currently not possible to set the taskbar icon via wxPython (Unless you hack apart the system variables), this is because windows gets the application icon from the executable (Which in your case is Python)

If you use either pyinstaller or py2exe (I prefer the former), when compiling it can set the applications icon - which will make the taskbar icon correct.

If using pyinstaller, you'll want to set the icon as such in the specfile:

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.datas,
          name=os.path.join('..\\path\\to\\output', 'AppName.exe'),
          icon='C:\\abs\\path\\to\\icon\\icon.ico',
          debug=False,
          strip=False,
          upx=False,
          console=False )

The icon=... line sets the taskbar icon.

The rest of your python code is fine as is.

2 Comments

-1 as it is normally possible to set the taskbar icon in wxPython.
Not to any of my testing, nor the wxPython mailing lists in regards to Win7.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.