web-dev-qa-db-ja.com

tkinter TclError:ビットマップファイルの読み取りエラー

私は次のようにアプリケーションアイコン(python3/tkinter)を設定しようとしています:

Interface()
root.title("Quicklist Editor")
root.iconbitmap('@/home/jacob/.icons/qle_icon.ico')
root.resizable(0, 0)
root.mainloop()

何をしても、次のようなエラーメッセージ(アイドル)が表示され続けます。

return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
_tkinter.TclError: error reading bitmap file "/home/jacob/.icons/qle_icon.ico"

何が悪いのですか?

19
Jacob Vlijm

問題はコードではなく、アイコンです。 Gimp(一部のKDEアイコンエディター)以外のプログラムを使用してxbmを作成しようとしましたが、恐ろしく醜く見えますが、アイコンは表示されます。私のPythonプログラムに「理解できる」アイコンを与えるクリエイターを見つける必要があると思います。


編集する

iconbitmapメソッドは白黒のみであることが判明したため、結局役に立たなかった。

長い検索の結果、Python 3(Linuxの場合)のアプリケーションのアイコンの色を設定する解決策が見つかりました。見つかりました here

root = Tk()
img = PhotoImage(file='your-icon')
root.tk.call('wm', 'iconphoto', root._w, img)
53
Jacob Vlijm

これは古い質問であり、Webには多くのことが書かれていますが、すべて正しくないか不完全なため、実際に機能するようになったら、実際に機能するコードをここに記録しておくとよいと思いました。

まず、アイコンを作成し、Windows「ico」とUnix「xbm」の2つの形式で保存する必要があります。 64 x 64が適切なサイズです。 XBMは1ビット形式です。ピクセルはオンまたはオフなので、色もグレーもありません。すべてのLinuxデスクトップが実際のアイコンをサポートしているにもかかわらず、tkinterのLinux実装はXBMのみを受け入れます。そのため、そこには運がありません。また、XBM仕様では、「オン」ビットが黒と白のどちらを表すかが不明確であるため、一部のデスクトップではXBMを反転する必要がある場合があります。 Gimpはこれらを作成するのに適しています。

次に、アイコンをタイトルバーに配置するには、次のコード(Python 3)を使用します。

import os
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("My Application")
if "nt" == os.name:
    root.wm_iconbitmap(bitmap = "myicon.ico")
else:
    root.wm_iconbitmap(bitmap = "@myicon.xbm")

root.mainloop()
15

私はこれを試しましたが、Windows 7を使用して動作させることができませんでした。

修正を見つけました。

ジェイコブの答えを使用しますが、ファイルは.gif私のOSを使用している場合(Windows 7)が表示されます。

MSペイントを使用して64x64 gifを作成し、保存して、ファイルパスとビンゴを使用して、機能します。

7
Micrified

これにより、PNGファイルをアイコンとして使用できるようになり、色がレンダリングされます。 Xubuntu 14.04、32ビットでPython 3.4(rootTkオブジェクトです)でテストしました:

import sys, os
program_directory=sys.path[0]
root.iconphoto(True, PhotoImage(file=os.path.join(program_directory, "test.png")))

(すべてのコンテキストで同じ場所でtest.pngを検索するには、プログラムディレクトリを見つけることが重要です。os.path.joinは、test.pngをプログラムディレクトリに追加するクロスプラットフォームの方法です。)

TrueをFalseに変更すると、メインアイコンではないウィンドウに同じアイコンが使用されなくなります。

これがWindowsとMacで動作するかどうか教えてください。

5
Shule

これがクロスプラットフォーム能力の助けになることを願っています

LOGO_PATH="pic/logo.ico"
LOGO_LINUX_PATH="@pic/logo_1.xbm"  #do not forget "@" symbol and .xbm format for Ubuntu 
root = Tk()
    if detect_screen_size().detect_os()=="Linux":
        root.iconbitmap(LOGO_LINUX_PATH)
    else:
        root.iconbitmap(LOGO_PATH)
0