Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 13, 2015 20:16:17

kaper156
Зарегистрирован: 2015-06-06
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

PIL и ttk.Treeview

Здравствуйте. Есть некое приложение получающее объект класса Group(id, name, photo_50). Где photo_50 - ссылка на картинку.

def insert_group(self, group, _type, index=END):
        from PIL import Image, ImageTk
        import urllib.request
        import os.path
        img_path = './cache/%s_50.jpg' % group.id
        if not os.path.exists(img_path):
            if not os.path.exists('cache'):
                os.mkdir('cache')
            with open(img_path, 'wb') as img_file:
                img_file.write(urllib.request.urlopen(group.photo_50).read())
        image = Image.open(img_path)
        photo = ImageTk.PhotoImage(image, size=500)
        # Здесь выбирается Treeview, не обращайте внимание
        # ибо строка вставляется
        tv = self.my_table
        tv.insert('', index, image=photo, values=(group.name, group.__repr__()))
       
Проблема в том, что изображение стабильно загружается, но не показывается внутри приложения.

Отредактировано kaper156 (Июнь 13, 2015 20:54:25)

Офлайн

#2 Июнь 13, 2015 20:25:52

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

PIL и ttk.Treeview

Какая версия питона?

Офлайн

#3 Июнь 13, 2015 20:52:44

kaper156
Зарегистрирован: 2015-06-06
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

PIL и ttk.Treeview

4kpt_III
Какая версия питона?
$ python3
Python 3.4.3 (default, Mar 25 2015, 17:13:50) 
[GCC 4.9.2 20150304 (prerelease)] on linux

Офлайн

#4 Июнь 13, 2015 21:04:48

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

PIL и ttk.Treeview

Должно работать.
Смотрите. Я вставляю через конфигурирование.

values=((code, name, description, keywords, price))
table.insert("", "end", text="", tag=code, values=values)
table.tag_configure(code, image=image_obj)

Офлайн

#5 Июнь 13, 2015 22:40:05

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

PIL и ttk.Treeview

давно не юзал tkinter, но вроде такие случаи имел ввиду Лутц, когда писал:

“Отметьте также, что мы сохраняем ссылки на объекты изображений в списке – если этого не сделать, изображения будут уничтожены при утилизации их объектов сборщиком мусора, даже если в этот момент они будут отображаться на экране. Чтобы избежать такой неприятности, мы сохраняем ссылки на объекты в долгоживущем списке.”

Офлайн

#6 Июнь 13, 2015 22:44:01

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

PIL и ttk.Treeview

WoMax
Это не совсем то, но тоже важно. В скрипте вставляется одно изображение. Причем в теле функции. Поэтому тут не тот вариант.

Офлайн

#7 Июнь 14, 2015 08:38:46

kaper156
Зарегистрирован: 2015-06-06
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

PIL и ttk.Treeview

Сделал так.

        tv.insert('', index, text='Name', tag=group.id, values=(group.name, group.__repr__()))
        tv.tag_configure(group.id, image=photo, text=None)
Теперь через раз, то вот так ругает:
  File "/.../script.py", line 223, in insert_group
    tv.tag_configure(group.id, image=photo, text=None)
  File "/usr/lib/python3.4/tkinter/ttk.py", line 1450, in tag_configure
    tagname)
  File "/usr/lib/python3.4/tkinter/ttk.py", line 297, in _val_or_dict
    res = tk.call(*(args + options))
_tkinter.TclError: unknown option "pyimage1"
то вот так:
File "/.../script.py", line 223, in insert_group
    tv.tag_configure(group.id, image=photo, text=None)
  File "/usr/lib/python3.4/tkinter/ttk.py", line 1450, in tag_configure
    tagname)
  File "/usr/lib/python3.4/tkinter/ttk.py", line 297, in _val_or_dict
    res = tk.call(*(args + options))
_tkinter.TclError: value for "-text" missing
Но во втором варианте появляется изображение.
Подозреваю: нужно выводить только фото, а текст как-то занулить.

upd: Появилась фантастиш-тормоза идея. Если картинка только при исключении “_tkinter.TclError: value for ”-text“ missing”, то в лупе пытаться поймать именно её Но объем картинок может быть в 2000 и более.

Отредактировано kaper156 (Июнь 14, 2015 09:07:08)

Офлайн

#8 Июнь 14, 2015 17:16:58

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

PIL и ttk.Treeview

А вот это уже проблема, про которую написал WoMax

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version