python tkinter圖標(biāo)不顯示的原因及完美解決方案

tkinter的按鈕幕屹、標(biāo)簽等都可以用圖標(biāo)顯示蓝丙,但是可能存在不顯示的問題。當(dāng)然包括多種原因望拖,比如路徑不對渺尘、圖片格式不對等。這些都不是本文要解決的说敏。本文所說的不顯示具體指鸥跟,

1.在一個函數(shù)內(nèi)生成圖標(biāo)

def createImageProcess():
    scan1 = icon("skip_forward_16x16.gif").get()
    btn1 = tk.Button(master,image = scan1, text="new")

(請暫且忽略icon,這是我自己定義的一個圖片導(dǎo)入類盔沫。)
2.在一個類的方法內(nèi)生成圖標(biāo)

class A:
  def createImageProcess(self):
    scan1 = icon("skip_forward_16x16.gif").get()
    btn1 = tk.Button(master,image = scan1, text="new")

3.這一種最為詭異医咨。大概的情況是我已經(jīng)生成了有圖標(biāo)的按鈕,然后再在界面上修改時迅诬,原有的圖標(biāo)——嗖——不見了腋逆。就像下面這樣


1

2

在圖1中圖標(biāo)還在,等生成第二個tab的時候侈贷,圖標(biāo)不見了(請忽略圖2中的藍色惩歉,那是我解決問題以后出現(xiàn)的)

對于前兩種情況產(chǎn)生的原因已經(jīng)有一些博文解釋了,也給出了解決方案俏蛮。原因是python的垃圾回收機制撑蚌。當(dāng)函數(shù)運行結(jié)束后,其中的局部變量被回收了搏屑,圖片被銷毀争涌。所以,解決方案就是阻止圖片被銷毀辣恋。對于第一種亮垫,將圖片提到函數(shù)外面

 scan1 = icon("skip_forward_16x16.gif").get()
def createImageProcess():
    btn1 = tk.Button(master,image = scan1, text="new")

第二種,將圖片寫成類屬性

class A:
  def createImageProcess(self):
    self.scan1 = icon("skip_forward_16x16.gif").get()
    btn1 = tk.Button(master,image = self.scan1, text="new")

但是對于第三種伟骨,怕是比較詭異了饮潦。我是頭一次見到,大概你也是吧携狭。我猜想也還是被回收了继蜡。
如果是小一點的程序,用上邊的方法應(yīng)該夠了。但是對于一個復(fù)雜的程序稀并,上邊的方法始終感覺有些不完美仅颇。所以,完美解決這個問題也就成了本文的主旨碘举。
要想阻止被回收忘瓦,一種方法是定義全局變量。當(dāng)然這絕對不是完美的方案殴俱。還有一種就是用一個單例政冻。單例是替換全局變量的一個套路解法。但是這里還有一些變化线欲。因為我們的圖片有很多個明场。所以需要修改一下。先上代碼

import os
import tkinter as tk

class icon(object):
    _instance = {}
    def __init__(self, name):
        self.path = os.path.join(
                os.path.dirname(os.path.abspath(__file__)), "icons",
                name)
    
    @classmethod  
    def instance(cls, name):
        if name not in icon._instance.keys():
            i = icon(name)
            icon._instance[name] = i.get() 
        return icon._instance[name]
        
    def get(self):
        return tk.PhotoImage(file = self.path)

這是一個基礎(chǔ)版本的單例寫法李丰。不同之處在于instance方法中傳入了圖片名稱苦锨。用一個公有變量_instance保存了所有已導(dǎo)入的圖片。當(dāng)已經(jīng)導(dǎo)入時趴泌,直接返回舟舒。沒有導(dǎo)入時,才用tk.PhotoImage導(dǎo)入嗜憔。
這個方案用起來很方便秃励。所有的圖片保存在icons文件夾下。導(dǎo)入的時候只需要

tk.Button(master,
          image = icon.instance("file_(add)_16x16.gif"), 
          text="new")

隨便在哪個函數(shù)吉捶、哪個類的方法里用夺鲜,都不存在問題了。
要說這個方案也存在一點瑕疵呐舔。在多線程的時候圖片可能重復(fù)導(dǎo)入币励。要修改得加線程鎖。但是珊拼,我們只是讀取圖片食呻。重復(fù)導(dǎo)入一張圖片也沒什么大礙。簡簡單單的挺美澎现。
Beautiful仅胞!用你肉嘟嘟的小手給我點個贊吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剑辫,一起剝皮案震驚了整個濱河市干旧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揭斧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讹开,居然都是意外死亡盅视,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門旦万,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闹击,“玉大人,你說我怎么就攤上這事成艘∩桶耄” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵淆两,是天一觀的道長断箫。 經(jīng)常有香客問我,道長秋冰,這世上最難降的妖魔是什么仲义? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮剑勾,結(jié)果婚禮上埃撵,老公的妹妹穿的比我還像新娘。我一直安慰自己虽另,他們只是感情好暂刘,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捂刺,像睡著了一般谣拣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叠萍,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天芝发,我揣著相機與錄音,去河邊找鬼苛谷。 笑死辅鲸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腹殿。 我是一名探鬼主播独悴,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锣尉!你這毒婦竟也來了刻炒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤自沧,失蹤者是張志新(化名)和其女友劉穎坟奥,沒想到半個月后树瞭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡爱谁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年晒喷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片访敌。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡凉敲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寺旺,到底是詐尸還是另有隱情爷抓,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布阻塑,位于F島的核電站蓝撇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叮姑。R本人自食惡果不足惜唉地,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望传透。 院中可真熱鬧耘沼,春花似錦、人聲如沸朱盐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兵琳。三九已至狂秘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躯肌,已是汗流浹背者春。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留清女,地道東北人钱烟。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像嫡丙,于是被迫代替她去往敵國和親拴袭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,093評論 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5曙博? 答:HTML5是最新的HTML標(biāo)準(zhǔn)拥刻。 注意:講述HT...
    kismetajun閱讀 27,453評論 1 45
  • 1.設(shè)計模式是什么般哼? 你知道哪些設(shè)計模式吴汪,并簡要敘述靶累?設(shè)計模式是一種編碼經(jīng)驗岭妖,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,140評論 0 12
  • 2019.04.10 直播中晾匠,王老師講到姑食,中國傳統(tǒng)制造業(yè)企業(yè)或服務(wù)業(yè)企業(yè),他們積累的經(jīng)驗送朱、人才、技術(shù)具有非凡的價值...
    PM三石閱讀 614評論 0 0
  • 現(xiàn)在一直上夜班,雖然升為了實習(xí)隊長臀晃,但這不是自己想干的,我想做的是中控介劫,好為以后更長遠想徽惋,先等項目穩(wěn)定后再進行調(diào)整...
    隨想隨談閱讀 113評論 0 1