2013-08-30 70 views
28

當我試圖改變從醜陋的紅色「TK」使用下面的代碼我自己的圖標左上角的窗口圖標,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 - 沒有工作
  • 我看這個問題了很多網站上

第三點,我最喜歡的Tkinter網站effbot.org告訴我Windows忽略了iconbitmap函數。 但這並不能解釋它爲什麼會拋出錯誤!

有一些「黑客」的方法可以避免這個問題,但它們都不是爲Python 3.x編寫的。

所以我的最後一個問題是:有沒有辦法使用Python 3.x和Tkinter獲取自定義圖標?

此外,不要告訴我我應該使用另一個GUI庫。我希望我的程序能夠在每個平臺上工作。我也想要一個編碼版本,而不是py2exesth解決方案。

+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

老兄,你很棒(或者我只是有點蠢)。只剩下一個問題了?是否有動態加載路徑而不是固定路徑的簡單可能性?因爲這會給我更多的自由:) – CrushedPixel

+0

@CrushedPixel - 你所做的不是愚蠢的。事實上,如果'favicon.ico'在路徑上,它應該已經工作。無論如何,我想你可以使用'os'模塊來構建一些動態的東西來走動某些查找「.ico」文件的目錄。但是,這可能會導致您加載錯誤的圖像,這會令人尷尬。我的建議是選擇你想要的圖標,然後將其與腳本保持一致。 – iCodez

+0

還有一件事我需要知道 - 當我不指定路徑時,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未定義」是永遠存在的。是的,我設定了正確的路徑。

它所工作是這樣的:

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

其中sp是腳本路徑,root Tk的根窗口。

這是很難理解它是如何做的工作(我無恥地從fedoraforums複製它),但它的工作原理

+0

作品感謝分享 – citizen2077

+0

這適用於FreeBSD。從那裏我會猜測它適用於所有基於Xorg/X11的系統。它不在OS X下的Native Tk上設置圖標。我沒有在Windows上測試它。 – cshilton

-1

所以看起來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' 
+0

這是一個非常糟糕且依賴於平臺的方式,並且在路徑上操作而不是使用'os.path'中的函數的方式仍然稍微受損。 – BlackJack