質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2524閲覧

【tkiinter】messageboxの左上アイコンの表示エラー?【Python】

netz-eng

総合スコア105

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/08/20 07:58

編集2020/08/21 06:08

tkinterのメッセージボックス左上アイコンに、任意のアイコン画像を表示したい

tkinterでGUIを作成しています。
GUIの左上アイコンを任意のアイコン画像にしているのですが、それがメッセージボックスには反映されていません

通常のtkinterのアイコンでもなく、添付画像のような謎の画像になってしまいます。(添付し忘れていたため、編集しました)
イメージ説明

作成したアイコンは、16x16、32x32、48x48、64x64、128x128ピクセルの.pngファイルを一つにまとめた.icoファイルのものです。

該当のソースコード

python

1import tkinter as tk 2from tkinter import messagebox 3 4root = tk.Tk() 5root.geometry("500x500") 6root.title("title") 7 8icon = "Icon.ico" 9root.iconbitmap(default=icon) 10 11def btn_click(): 12 messagebox.showinfo("message", "message") 13 14btn = tk.Button(text="BUTTON", command=btn_click) 15btn.pack() 16 17root.mainloop()

試したこと

root.iconphoto() で全てのウィンドウにアイコンを適用できるそうですが、試してみたところ、下のエラーが出ました。

python

1Traceback (most recent call last): 2 File "C:\~~~\samplepy", line 9, in <module> 3 win.iconphoto(True, tk.PhotoImage(file=r"C:\Users\~~~\Icon.ico")) 4 File "C:\Users\~~~\envs\Ormr\lib\tkinter\__init__.py", line 4061, in __init__ 5 Image.__init__(self, 'photo', name, cnf, master, **kw) 6 File "C:\Users\~~~\envs\Ormr\lib\tkinter\__init__.py", line 4006, in __init__ 7 self.tk.call(('image', 'create', imgtype, name,) + options) 8_tkinter.TclError: couldn't recognize data in image file "C:\Users\~~~\Icon.ico"

どうやら .iconphoto() は、.icoには対応していないようです。
.icoファイルでなければ複数サイズの画像を適用することができないので、.iconphoto()は今回は適さないようです。

補足情報(FW/ツールのバージョンなど)

Windows10
python 3.8.3
tkinter 8.6

追記

アイコンに使用した画像のサンプルを添付します。元画像は610x610ピクセルです。
元画像
これを元に、画像リサイズ(高画質・縮小・拡大) Web便利ツール@ツールタロウで、16x16、24x24、32x32、48x48、64x64、128x128ピクセルの画像を作りました。
16x16 24x24 32x32 48x48 64x64 128x128
そして、マルチアイコン作成で6つの画像を同梱した.icoファイルを作成しました。(※teratailの仕様で.icoファイルを添付できないため、作り方のみの説明とさせていただきます。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

イメージ説明

画像ファイルの問題ではないでしょうか。(tk側で対応できる形式・サイズ等の制限?)
掲載のコード(iconbitmap)そのままコピー&ペーストで動作しました。win10/python3.8.3/tk8.6

追記: 参考までに、動作テストに利用したicoファイルは
サイズ情報 0,16,24,32,48,64,72,96,128 で内部に格納されてる画像の形式はPNGでした。

訂正: PNG画像はicoのヘッダで0x0 になっているもののみ。実際のサイズは256x256

投稿2020/08/20 10:55

編集2020/08/21 03:44
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

netz-eng

2020/08/20 12:16

ご回答ありがとうございます。 そうなんですね…… そちらで使用されている画像は、何ピクセルですか? 参考にさせていただきたいです。
teamikl

2020/08/20 13:46 編集

サイズは上記の通り 16x16, 24x24, 32x32 ~・・・ bits per pixel は 32でした。 (0x0は詳しく調べてません。icoのヘッダではなく画像データ側にサイズ情報があるのかもしれないです) 追記: 画像は、検索して上の方にあったサイトより、緑色の 「ICO」 からダウンロードしました。 https://www.iconarchive.com/show/mono-general-2-icons-by-custom-icon-design/document-icon.html サイトの説明を見たところ、0x0 の実際のサイズは 512x512 かもしれない(未確認)
netz-eng

2020/08/20 15:44

なるほど、ご確認いただきありがとうございます。 大きいサイズはあまり関係ないと思い、24x24ピクセルを加えて新しく.icoファイルを作ってみましたが、結果は同じでした。 しばらく試行錯誤してみようと思います。 他の方からのご回答がなければ、BAにさせていただきます!
teamikl

2020/08/21 02:56

もう少し詳細・訂正、PNG形式だったのは icoでサイズが 0x0 のデータのみで、 PNG画像のサイズは256x256でした。 - 上の ico ファイルで正常に表示できるかどうかの確認 (環境の違いということも有りえます) - 問題が再現できる ico 画像の特徴を調べる  どのように ico 画像を作成したのか、→同じ手順でファイルを作成し、問題が再現できるかを試す  可能ならicoファイルを提供して頂ければ、もう少し詳しく調べられます。
netz-eng

2020/08/21 05:44

訂正ありがとうございます! 夜になってしまいますが、貼っていただいたリンク先のアイコンで試してみます。 問題が発生したアイコンそのものは、デザインの権利上ここに貼れないのですが、同じ作り方、サイズのサンプルを質問文の追記欄に添付させていただきます。お時間があるときに調べていただると嬉しいです!
teamikl

2020/08/21 08:36 編集

添付の610x610を元に同様の手順で、症状を確認出来ましたが、 ダイアログのみでなく親ウィンドウのアイコンも同じように(壊れた画像?が)表示されました。 (手順に細かな違いはあるかもしれませんが、問題を調べるには十分な手掛かりです) 他のpngファイルを元に同様の手順でICOファイル作成を試したところ、 正常に表示できるものもありました。 ICO ファイル内の画像の情報を調べれば、 原因や tk側で対応できる・出来ない形式が解りそうですね。 個人的にも興味のある点なので、ここは調べてみます。 ICOファイルに拘るのでなければ、回避策 root.iconphoto(True, tk.PhotoImage(file="610x610.png")
netz-eng

2020/08/22 09:00

ご確認ありがとうございます。なぜか画像がおかしくなってしまうんですよね…… > 個人的にも興味のある点なので、ここは調べてみます。 本当に助かります! 何か分かったことがあれば是非教えてください。 > ICOファイルに拘るのでなければ、回避策 > root.iconphoto(True, tk.PhotoImage(file="610x610.png") 確かにそうですね、tkinterのGUI内で使用するアイコンのサイズが同じなら、適したサイズの.pngファイル一つで足りるかもしれません。 試してみようと思います。
netz-eng

2020/08/22 12:08

root.iconphotoで、画像を.pngファイル形式で指定したところ、メッセージボックスにも無事アイコンが表示されました! サンプルのように大きいサイズの画像では、左上アイコンに縮小・適用する際に画像が潰れてしまうようなので、いい塩梅にサイズを調整する必要がありそうです。(これを解消するには.ico形式のほうが都合がいいのですが、背に腹は返られませんね……)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問