Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Проблема в классе на основе Canvas модуля Tkinter [RSS Feed]

#1 Май 27, 2017 07:54:57

Kemok
Зарегистрирован: 2017-04-11
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема в классе на основе Canvas модуля Tkinter

Всем здравствуйте! Создал класс на основе Canvas, выглядит он следующим образом:

 from requests import get
import tkinter as tk
import base64
class Item_image(tk.Canvas):
    def __init__(self, ID, master=None):
        self.ID = ID
        self.master = master
        s = get('http://ddragon.leagueoflegends.com/cdn/6.24.1/img/item/{}.png'.format(self.ID))
        tk.Canvas.__init__(self, master=self.master, width=32, height=32, bd=-1)
        if self.s.ok:
            self.data = base64.b64encode(s.content)
            self.image = tk.PhotoImage(data=self.data).subsample(2, 2)
            self.create_image(18, 18, image=self.image)
list_items = [1055, 2003, 3340, 3145, 3020, 3152, 3157, 3116, 1029, 1001,
              3191, 3001, 3135, 3151, 1057, 3089, 3363, 3153, 3006, 3085,
              3812, 3036, 3139, 3303, 2049, 3364, 3107, 2301, 3022, 3091,
              3026, 3001, 3135, 3151, 1057, 3036, 3020, 3191, 3001, 3135,
              1029, 1001, 1055, 2003, 3340, 3026, 3006, 3085, 1001, 3006]
root = tk.Tk()
tex = tk.Text(root)
for item in list_items:
    tex.insert(tk.END, '{')
    tex.window_create(END, window=Item_image(item))
    tex.insert(tk.END, '}')
tex.pack()
root.mainloop()
Все работает нормально, но программе приходится делать по несколько раз одни и те же запросы на сервер, на это уходит много времени. Решил немного оптимизировать процесс сохраняя объекты Item_image в словарь.
Измененный код выглядит так:
 from requests import get
import tkinter as tk
import re, json, os, base64
class Item_image(tk.Canvas):
    def __init__(self, ID, master=None):
        self.ID = ID
        self.master = master
        s = get('http://ddragon.leagueoflegends.com/cdn/6.24.1/img/item/{}.png'.format(self.ID))
        tk.Canvas.__init__(self, master=self.master, width=32, height=32, bd=-1)
        if s.ok:
            self.data = base64.b64encode(s.content)
            self.image = tk.PhotoImage(data=self.data).subsample(2, 2)
            self.create_image(18, 18, image=self.image)
list_items = [1055, 2003, 3340, 3145, 3020, 3152, 3157, 3116, 1029, 1001,
              3191, 3001, 3135, 3151, 1057, 3089, 3363, 3153, 3006, 3085,
              3812, 3036, 3139, 3303, 2049, 3364, 3107, 2301, 3022, 3091,
              3026, 3001, 3135, 3151, 1057, 3036, 3020, 3191, 3001, 3135,
              1029, 1001, 1055, 2003, 3340, 3026, 3006, 3085, 1001, 3006]
dict_image = {} #Для сохранения объектов Item_image
root = tk.Tk()
tex = tk.Text(root)
for item in list_items:
    tex.insert(tk.END, '{')
    if not item in dict_image:
        dict_image[item] = Item_image(item)
    tex.window_create(tk.END, window=dict_image[item])
    tex.insert(tk.END, '}')
tex.pack()
root.mainloop()
И здесь начинаются проблемы. Вчера пол дня провозился, так и не дошло в чем тут дело. При обращении к объекту, который создавался ранее, он не вставляется в tex.

Помогите пожалуйста увидеть в чем моя ошибка. Можно конечно это обойти и сделать оптимизацию иначе, но все равно хочется знать в чем тут подвох. Что не так с этим классом?

Офлайн

#2 Май 27, 2017 18:05:14

Kemok
Зарегистрирован: 2017-04-11
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема в классе на основе Canvas модуля Tkinter

Упростил класс до функции:

 def Item_image(ID, master=None):
    can = tk.Canvas(master=master, width=32, height=32, bd=-1)
    return can
Поведение тоже самое.

Офлайн

  • Начало
  • » GUI
  • » Проблема в классе на основе Canvas модуля Tkinter[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version