以下のコードを使用して、左上隅のウィンドウアイコンをい赤い「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
私がすでにやったこと:
.png
や.bmp
などの他のファイル形式を試しました-どれも機能しませんでした3番目のポイントとして、Tkinterに関する私のお気に入りのサイトであるeffbot.orgは、Windowsがiconbitmap
関数を無視することを教えてくれました。しかし、これはエラーをスローする理由を説明しません!
この問題を回避するための「ハック的な」方法はいくつかありますが、Python 3.x向けに書かれたものはありません。
私の最後の質問は:Python 3.xとTkinterを使用してカスタムアイコンを取得する方法はありますか?
また、別のGUIライブラリを使用する必要があると言ってはいけません。プログラムをすべてのプラットフォームで動作させたい。 py2exe
やsth
のソリューションではなく、コード化されたバージョンも必要です。
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()
ここで提案されている方法は機能しません。エラー「ビットマップxxxが定義されていません」が表示されます。そして、はい、正しいパスを設定しました。
それがdid動作するのはこれです:
imgicon = PhotoImage(file=os.path.join(sp,'myicon.gif'))
root.tk.call('wm', 'iconphoto', root._w, imgicon)
ここで、sp
はスクリプトパス、root
はTkルートウィンドウです。
それがどのように機能するかを理解するのは難しいです(私は恥知らずに fedoraforums からそれをコピーしました)が、それは動作します
これは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'))
#!/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()
このように動作するはずです!
それにもこだわりました...
最後に、次のコードを使用して、必要なアイコンを設定しました:
from tkinter import *
root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png'))
両方のコードは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で動作します]
.icoファイルも破損していないことを確認してください。別の.icoファイルを試したときに消えた同じエラーが表示されました。
したがって、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]
''
>>>
from tkinter import *
from PIL import ImageTk, Image
Tk.call('wm', 'iconphoto', Tk._w, ImageTk.PhotoImage(Image.open('./resources/favicon.ico')))
上記は私のために働いた。