web-dev-qa-db-ja.com

ウィンドウのアイコンを設定

以下のコードを使用して、左上隅のウィンドウアイコンをい赤い「TK」から自分のファビコンに変更しようとすると、Pythonがエラーをスローしました。

from tkinter import *
root = Tk()

#some buttons, widgets, a lot of stuff

root.iconbitmap('favicon.ico')

これにより、アイコンが「favicon.ico」に設定されるはずです(Web上の多くのフォーラム投稿による)。しかし、残念ながら、この行はすべて次のエラーをスローします。

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ライブラリを使用する必要があると言ってはいけません。プログラムをすべてのプラットフォームで動作させたい。 py2exesthのソリューションではなく、コード化されたバージョンも必要です。

42
CrushedPixel

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()
48
iCodez

ここで提案されている方法は機能しません。エラー「ビットマップxxxが定義されていません」が表示されます。そして、はい、正しいパスを設定しました。

それがdid動作するのはこれです:

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

ここで、spはスクリプトパス、rootはTkルートウィンドウです。

それがどのように機能するかを理解するのは難しいです(私は恥知らずに fedoraforums からそれをコピーしました)が、それは動作します

18
alessandro

これはLinux上のPython3で動作します:

import tkinter as tk

# Create Tk window
root = tk.Tk()

# Add icon from GIF file where my GIF is called 'icon.gif' and
# is in the same directory as this .py file
root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='icon.gif'))
4
Steve Daulton
#!/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()

このように動作するはずです!

1
Malek B.

それにもこだわりました...

最後に、次のコードを使用して、必要なアイコンを設定しました:

from tkinter import *
root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png'))
1
Yuval Farkash

両方のコードはpython 3.7でうまく機能しています。

import tkinter as tk
m=tk.Tk()
m.iconbitmap("myfavicon.ico")
m.title("SALAH Tutorials")
m.mainloop()

また、プロジェクトスクリプトファイルが存在する同じフォルダーに「myfavicon.ico」を保持することを忘れないでください

別の方法

from tkinter import *
m=Tk()
m.iconbitmap("myfavicon.ico")
m.title("SALAH Tutorials")
m.mainloop()

[*注:-pythonバージョン3はtkinterで動作し、バージョン3より下、つまりバージョン2はTkinterで動作します]

1
Er M S Dandyan

.icoファイルも破損していないことを確認してください。別の.icoファイルを試したときに消えた同じエラーが表示されました。

0
Daniel

したがって、root.iconbitmap()は固定ディレクトリのみをサポートしているように見えます。
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'

編集:
唯一の問題は、このメソッドがLinuxで機能しないことです。

josua@raspberrypi:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.argv[0]
''
>>>
0
Josua Robson
from tkinter import *
from PIL import ImageTk, Image

Tk.call('wm', 'iconphoto', Tk._w, ImageTk.PhotoImage(Image.open('./resources/favicon.ico')))

上記は私のために働いた。

0
Tarun Kolla