[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум Panda3D - по русски » Panda3D » Общие вопросы » Обновление картинки
Обновление картинки
liquideДата: Вторник, 12.11.2019, 12:30 | Сообщение # 1
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
В общем такая ситуация. Грубо говоря сделал редактор юнита, можно выбрать в кольчуге или латах будет, оружие какое будет носить. Когда это все выбрал, то программа берет заранее нарисованные картинки и склеивает их. Склеиваю с помощью PIL. И все работает вплоть до момента когда эту картинку надо обновить в Directlabel. А он ее меняет только в первый раз, во все остальные разы он ничего не делает. Причем я пробовал все, я удалял полностью переменную создавал новую, разными способами указывал и .setImage, и label['image'], и напрямую setImage(self.pictureName), и через load.texture, с OnsreenImage та же фигня. Причем склейка точно работает правильно, потому что картинка итоговая сохраняется в корень и там все правильно. Но эта картинка не обновляется в Directlabel. 

Вот объявляю DirectLabel в функции когда создается юнит
Код
self.pictureName = str(name) + '.png'
self.pictureSoldier = DirectLabel(image='Peasant.png',
                    pos=(-1, 0, 0.4), scale=0.5, relief=None,
                    parent=self.mainFrame)
self.pictureSoldier.setTransparency(True)
 И вот часть кода которая почему то не работает. 

Код
def newPicture(self):
        if len(self.soldier.clothedAmmu) != 0:
                self.img1 = Image.open(self.soldier.ammunition[self.soldier.dictAmm[self.soldier.clothedAmmu[0]]][7])
                if len(self.soldier.clothedWeapon) != 0 and self.soldier.clothedWeapon[0] != '':
                        self.img2 = Image.open(self.soldier.ammunition[self.soldier.dictAmm[self.soldier.clothedWeapon[0]]][7])
                        self.img1.paste(self.img2, (0, 0), self.img2)
                if len(self.soldier.clothedWeapon) > 1 and self.soldier.clothedWeapon[1] != '':
                        self.img2 = Image.open(self.soldier.ammunition[self.soldier.dictAmm[self.soldier.clothedWeapon[1]]][7])
                        self.img1.paste(self.img2, (0, 0), self.img2)
            self.img1.save(self.pictureName)

        self.pictureSoldier.setImage(self.pictureName)

        self.switchBetweenFrame()
Вот так выглядит сначала. Выбираем амуницию и выберем кольчугу.


Картинка поменялась, параметры все тоже поменялись. А теперь дадим ему меч и щит иии характеристики поменялись, картинка нет.

 

Но в корне картинка правильно построенная, со щитом и мечом. В чем может быть дело? Он переменную эту резервирует где то в кэше и ее только использует?
Прикрепления: 9478296.png (126.1 Kb) · 8914318.png (114.4 Kb) · 0339931.png (114.9 Kb)
 
liquideДата: Вторник, 12.11.2019, 12:31 | Сообщение # 2
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
Вот итоговая картинка которая в корне



Прикрепления: 0962337.png (42.9 Kb) · 0878243.png (487.6 Kb)
 
ninthДата: Среда, 13.11.2019, 10:55 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
попробуй перед повторной загрузкой сделать unloadTexture()
 
liquideДата: Среда, 13.11.2019, 17:28 | Сообщение # 4
Сержант
Группа: Пользователи
Сообщений: 35
Награды: 0
Репутация: 0
Статус: Offline
Вы мой спаситель) Я так и думал, что проблема где то там, но не знал, что есть возможность выгружать текстуры. Самое интересное, что программа работала, когда все команды были грубо говоря в теле основной функции, но потом я решил, что раз столько повторяется одно и тоже, почему бы не улучшить код и не сделать еще одну функцию и после этого уже все сломалось)
 
ninthДата: Четверг, 14.11.2019, 08:08 | Сообщение # 5
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Странно на самом деле. Должно было одинаково работать. Панда действительно кеширует в памяти загруженные текстуры, поэтому когда повторно пытаешься загрузить текстурку по тому же пути она просто дёргает то что уже висит в памяти. Сделано для ускорения потому что разные модели зачастую используют одну и туже текстуру по несколько раз.
 
serg-kkzДата: Четверг, 14.11.2019, 18:44 | Сообщение # 6
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
Может имеет смысл использовать новоиспеченную функцию по замене текстуры:
Код
model.replaceTexture(oldTexture, newTexture)

Вот только сомневаюсь что с GUI это работать будет. В любом случае меш лучше будет.


ООП  -  

Сообщение отредактировал serg-kkz - Четверг, 14.11.2019, 18:47
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » Обновление картинки
  • Страница 1 из 1
  • 1
Поиск: