classification
Title: tkinter.messagebox does not use the application's icon
Type: enhancement Stage:
Components: Tkinter Versions: Python 3.4
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: Drew.French, gpolo, mark, terry.reedy
Priority: normal Keywords:

Created on 2012-06-26 07:19 by mark, last changed 2012-07-12 09:06 by mark.

Messages (5)
msg164053 - (view) Author: Mark Summerfield (mark) Date: 2012-06-26 07:19
The tkinter.messagebox functions, e.g., askyesno(), do not use the application's icon (if it has one). Nor do they accept a bitmapicon option, so ISTM that it is "impossible" to set one.

The same is true of tkinter.dialog, but for that it is easy enough to write one's own replacement with the code like this:

        try:
            tkinter._default_root.iconbitmap(iconName)
        except tk.TclError as err:
            print(err)

(where iconName is "path/to/icon.ico" on windows, "@path/to/icon.xbm" on Unix; and this isn't done on Mac).
msg164443 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2012-07-01 01:15
It is not clear to me what change your are proposing.
msg165069 - (view) Author: Mark Summerfield (mark) Date: 2012-07-09 07:42
On Linux & Windows every top-level window (including dialogs) normally has an icon at the left of the title bar. Typically this icon is the application's icon. But tkinter doesn't provide such an icon and so a system default icon is used instead. For one's own code this can be fixed by using the iconbitmap() function, but for the tkinter convenience dialogs (e.g., askyesno()), this cannot be done. So, my suggestion is to make the convenience dialogs use the same icon as the application (if the application has one).
msg165073 - (view) Author: Drew French (Drew.French) Date: 2012-07-09 08:42
This is also true for some of the other dialogs (such as the file dialogs). 

Does anyone know if this behavior can be changed in Tk itself?
msg165290 - (view) Author: Mark Summerfield (mark) Date: 2012-07-12 09:06
I think there is a solution to this that can be applied in one's own code:

app = tkinter.Tk()
icon = tkinter.PhotoImage(file="icon.gif")
app.tk.call("wm", "iconphoto", app, "-default", icon)

According to the docs (and it seems to be true), the icon thus set will be used for *all* the applications top-level windows.
History
Date User Action Args
2012-07-12 09:06:50marksetmessages: + msg165290
2012-07-09 08:42:51Drew.Frenchsetnosy: + Drew.French
messages: + msg165073
2012-07-09 07:42:47marksetmessages: + msg165069
2012-07-01 01:15:31terry.reedysetversions: + Python 3.4, - Python 3.2
nosy: + gpolo, terry.reedy

messages: + msg164443

type: enhancement
2012-06-26 07:19:48markcreate