2017-01-17 31 views
1

目前,我正在創建tkinter GUI應用程序,並且我正在使用一些圖像作爲treeview小部件中的項目的圖標。爲了讀取,並保持它們作爲參考我用這個代碼:在Tkinter中使用圖像作爲圖標獲得最佳性能的方式

self.logoadd = tk.PhotoImage(file='../img/add.png') 
self.logodel = tk.PhotoImage(file='../img/delete.png') 
... 
self.logoedit = tk.PhotoImage(file='../img/edit.png') 

#Keep them as references 
self.imgAdd = self.logoadd 
self.imgDel = self.logodel 
... 
self.imgEdit = self.logoedit 

而且我覺得這不是一個很好的做法,如果有使用超過30個圖像。另一種方法是:

  • 將圖像作爲字節字符串存儲在.py文件或;
  • 使用for循環來檢索文件夾中的所有圖像,將它們作爲變量傳遞。

我需要一些有經驗的GUI開發人員的建議。在GUI實踐中,哪種方式最適合性能和使用? (可能是我所有的方法都是錯誤的)

對於信息:這些圖像的尺寸是用於文件圖標的16×16和圖像

+1

我不太明白_best performance_的意思,因爲它好像是在尋求一種方法來避免寫出30+項目作業。如果是這樣,則使用字典來保存所有的'PhotoImage'並使用分配的鍵來獲取它。 –

+0

我的意思是最好的表現是速度和代碼。在treeview中,可能有數百個項目,它們的圖標可能有所不同。因此,閱讀正確的圖像並將它們放入GUI應該快速且易於維護。 – bzimor

+0

除非您擁有數千或數萬張圖像,否則性能差異將難以察覺。 –

回答

1

我在涉及PhotoImage是加載圖像中的多個Tkinter的應用程序都使用成字典以保持對它們的引用。

您可以手動完成,如果您有幾個設置的圖像,建議您手動操作,因爲它更容易看到您的設置。

import tkinter as tk 

image_cache = { 'add' : tk.PhotoImage(file = 'add.png'), 
       ... 
      } 

或者更緊湊的和動態的方法是使用os模塊和字典解析。使用這種方法,您的所有密鑰將是圖像的文件名,以便訪問您想要的圖像。

import os 
import tkinter as tk 

filepath = '../img/' 
image_cache = { os.path.splitext(filename)[0] : tk.PhotoImage(
    file = os.path.join(filepath, filename)) 
       for filename in os.listdir(filepath) } 

>>> image_cache['add'] # gets the PhotoImage for 'add.png' 

我不確定這種方法是否提供了最佳性能,但它是乾淨的,緊湊的和可用的。

+0

非常感謝,@Steven Summers。 2變種適合我的情況並且運作良好。 – bzimor

相關問題