2017-01-17 6 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 файле или;
  • Использование для цикла для извлечения всех изображений в папке передает их как переменные.

Мне нужны советы от опытных разработчиков графического интерфейса. Какой способ является лучшим для производительности и использования в графических интерфейсах? (Может быть, все пути мои неверны)

Для информации: Размер этих изображений 16x16 и изображения для значков файлов

+1

Я не совсем понимаю, что вы имеете в виду от _best performance_, потому что кажется, что вы просите о том, чтобы избежать записи более 30 пунктов. Если это так, используйте словарь вместо этого, чтобы сохранить все «PhotoImage» и получить его с помощью назначенного ключа. –

+0

Я имею в виду, наилучшая производительность - это скорость и код. В древовидной структуре может быть сто элементов, и их значки могут отличаться. Поэтому чтение правильных изображений и их включение в графический интерфейс должно быть быстрым и легким в обслуживании. – bzimor

+0

Если у вас нет тысяч или десятков тысяч изображений, разница в производительности будет незаметной. –

ответ

1

То, что я использовал в нескольких приложениях Tkinter, связанных с PhotoImage является загрузка изображений в словарь для поддержания ссылки на них.

Вы можете сделать это вручную, как это рекомендуется, если у вас есть несколько заданных изображений, потому что легче увидеть, что у вас есть.

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