2013-08-30 7 views
28

は、Pythonは、エラーがスローされました:セット]ウィンドウのアイコン

from tkinter import * 
root = Tk() 

#some buttons, widgets, a lot of stuff 

root.iconbitmap('favicon.ico') 

これは、設定する必要があります「favicon.ico」へのアイコン(ウェブ上の多くのフォーラム投稿によると)。しかし残念ながら、このすべての行がありません、次のエラーをスローです:

私はすでにやった
Traceback (most recent call last): 
    File "d:\ladvclient\mainapp.py", line 85, in <module> 
    root.iconbitmap(bitmap='favicon.ico') 
    File "C:\Python33\lib\tkinter\__init__.py", line 1637, in wm_iconbitmap 
    return self.tk.call('wm', 'iconbitmap', self._w, bitmap) 
_tkinter.TclError: bitmap "favicon.ico" not defined 

  • を私はパスを確認 - すべては私のような他のファイル形式を試してみました
  • 100%正確です.pngまたは.bmp - どれも
  • が、私は多くのウェブサイト上でこの問題を見上げ働いた

3番目の点については、Tkinterに関する私の好きなサイトであるeffbot.orgが、Windowsがiconbitmapの機能を無視していると語った。 しかし、これはなぜそれがエラーを投げるか説明しません!

この問題を回避するためのいくつかの「ハック的な」方法がありますが、いずれもPython 3.x用に書かれていません。

最後に、Python 3.xとTkinterを使用してカスタムアイコンを取得する方法はありますか?

また、別のGUIライブラリを使用する必要はありません。私のプログラムはすべてのプラットフォームで動作するようにしたい。私はまた、py2exeまたはsthソリューションではなく、コード化されたバージョンを求めています。

+0

は、スクリプトを実行しているフォルダ内の 'favicon.ico'ですか?他の賢明な方法は、完全なパスを提供する必要があります。また、あなたができることは、フォーマットを '.gif'に変更するだけで、tkinterが受け入れる唯一のフォーマットだと思います。 – enginefree

+0

@enginefree - いいえ.Tkinterは '.ico'も受け付けます。 – iCodez

答えて

31

favicon.icoは、あなたのスクリプトと同じフォルダに、つまり自分のパスに入れてはいけません。完全なパス名を入力してください。たとえば、この作品:

from tkinter import * 
root = Tk() 

root.iconbitmap(r'c:\Python32\DLLs\py.ico') 
root.mainloop() 

しかし、これはあなたの同じエラーで吹く:

from tkinter import * 
root = Tk() 

root.iconbitmap('py.ico') 
root.mainloop() 
+2

おい、あなたは素晴らしい(または私はちょっとばかだ)。残っている質問は1つだけですか?固定されているのではなく、パスを動的にロードするのは簡単でしょうか?これは私にある時点でより多くの自由を与えるからです:) – CrushedPixel

+0

@CrushedPixel - あなたがしたことは愚かではありませんでした。実際には、 'favicon.ico'が経路上にあればうまくいかなければなりません。とにかく 'os'モジュールを使って何か動的なものをビルドして、' .ico'ファイルを探す特定のディレクトリを歩くことができると思います。しかし、これにより間違ったイメージを読み込むことになり、困惑します。私のアドバイスは、あなたが望むアイコンを選んでスクリプトに残しておくことです。 – iCodez

+0

私は知る必要があることが1つ残っています - どのパスはPythonがパスを指定しないと思うと思いますか?私のコンピュータのどこのように、Pythonが「favicon.ico」を検索したのですか? – CrushedPixel

1
#!/usr/bin/env python 
import tkinter as tk 

class AppName(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.grid() 
     self.createWidgets() 

    def createWidgets(self): 
     self.quitButton = tk.Button(self, text='Quit', command=self.quit) 
     self.quitButton.grid() 

app = AppName() 
app.master.title('Title here ...!') 
app.master.iconbitmap('icon.ico') 
app.mainloop() 

それは次のように動作するはずです!

0

.icoファイルも破損していないことを確認してください。私は別の.icoファイルを試してみると同じエラーが出てしまった。

10

ここで示唆されていることはありません。エラー "ビットマップxxxが定義されていません"が存在します。そして、はい、私はそれに正しい道を設定します。 spは、スクリプトパス、およびroot Tkのルートウィンドウで

imgicon = PhotoImage(file=os.path.join(sp,'myicon.gif')) 
root.tk.call('wm', 'iconphoto', root._w, imgicon) 

:それ仕事をした何

はこれです。

それは仕事をしてどのように理解するのは難しい(私は臆面もなくfedoraforumsからそれをコピーした)が、それはroot.iconbitmap()だけで固定されたディレクトリをサポートしていますようだから、見え

+0

は共有のおかげです。 – citizen2077

+0

これはFreeBSDで動作します。それで、Xorg/X11ベースのすべてのシステムで動作すると思います。 OS XのネイティブTkにアイコンが設定されていません.Windowsでテストしていません。 – cshilton

-1

に動作します。
sys.argv[0]は、ファイルが読み込まれたディレクトリを返します。したがって、単純なコードで固定ディレクトリを作成できます。

import sys 
def get_dir(src): 
    dir = sys.argv[0] 
    dir = dir.split('/') 
    dir.pop(-1) 
    dir = '/'.join(dir) 
    dir = dir+'/'+src 
    return dir 

これは出力

>>> get_dir('test.txt') 
'C:/Users/Josua/Desktop/test.txt' 
+0

これは本当に恐ろしい、プラットフォームに依存し、 'os.path'の関数を使う代わりに、パス上で動作するようにやや壊れた方法です。 – BlackJack