Работал нормально весь день, вдруг перестал. Я вообще не верю, что изменил код, может у меня мозг перестал работать ???
class BorderWidgetWithLabel(BorderWidget):
def __init__(self, **kwargs):
super(BorderWidgetWithLabel, self).__init__(**kwargs)
self.text = " "
self.text=kwargs.get('text',' ')
print self.text
self.txt_bg_color=kwargs.get("txt_bg_color", [0,0,0,0])
self.bg_color=kwargs.get("bg_color", [0,0,0,0])
self.bind(pos=self.update_canvas)
self.bind(size=self.update_canvas)
self.update_canvas()
def update_canvas(self, *args):
#need to reset everything
self.canvas.clear()
with self.canvas:
get_color(self.border_color)
if (self.text! = ""):
texture=simple_text_texture(self.text)
Проблема:
/typeclasses/borderwidget.py", line 75, in update_canvas
if (self.text! = ""):
AttributeError: 'BorderWidgetWithLabel' object has no attribute 'text'
Я начал получать эту ошибку. Я добавил self.text = " " в __init__, а также оператор if в update_canvas. Что я делаю неправильно??
Если я избавлюсь от всех видов использования self.text, тогда печать self.text будет работать без проблем.
ОБНОВЛЕНИЕ :: Исправлено добавлением text = '' в качестве переменной класса. Это необходимо ?? или что-то не так с кодом. Поскольку print self.text в в этом отлично работает без переменной класса, я не могу предоставить менее полный образец
ОБНОВЛЕНИЕ :: Я удалил последнюю строку self.update_canvas () из в этом, и она работала без переменной класса, но я попытался воспроизвести это с помощью следующего
class SomeClass:
def __init__(self, **kwargs):
self.text=kwargs.get("text","hello")
self.update_class()
def update_class(self, *args):
if (self.text!=' '):
print self.text
SomeClass()
Не знаю, почему мне тогда не удалось его воспроизвести
Я исправил это, добавив к классу text = "" как переменную класса. Это нужно ??
поскольку функция печати работает без проблем, она является внутренней, и один из пакетов, скорее всего, может минимизировать или «завершить» вопрос, кажется маловероятным, я могу попробовать
Добавление text в качестве переменной класса не должно помочь. Это может Спрятать, какая бы у вас ни была проблема, но не решать. Если переменная экземпляра каким-то образом будет удалена, вы получите переменную класса - которая всегда будет ' ' вместо аргумента text из инициализатора, что бесполезно.
В любом случае, если вы не можете предоставить более полный образец, никто не сможет вам помочь. Если нет явной опечатки или чего-то, что я пропустил, что кто-то может заметить, просто нет способа отладить код, который мы не можем ни прочитать, ни запустить.
Я пытаюсь выйти из IDE и попробовать короткий сценарий консоли, который, надеюсь, воспроизведет проблему
Вы также должны добавить остальную часть трассировки, это еще не все.
это не удалось, я не могу воспроизвести его без пакетов Kivy
BorderWidget вызывает update_canvas () в собственном методе __init __ ()? Бьюсь об заклад, это проблема ...
Это была проблема, но я воспроизвел тот же сценарий, и он не потерпел неудачу даже в случае, если. Но это сработало, я вынул update_canvas
Когда python не может найти переменную экземпляра, он ищет переменную класса с таким же именем. Вот почему он перестает вылетать, когда вы добавляете text='' в класс. Но это всего лишь маскировка ошибки - переменная экземпляра должна быть там. @PaulBecotte догадывается, почему это происходит. Поместите self.text = kwargs.get(...)перед в __init__, чтобы посмотреть, исправляет ли это. Это также покажет полная трассировка стека.






Итак, похоже, у вас есть
class BW:
def __init__(self):
self.update_canvas()
def update_canvas(self):
pass
class BWL(BW):
def __init__(self):
super(BWL, self).__init__()
self.text = 'text'
self.update_canvas()
def update_canvas(self):
print self.text
Запуск BWL() вызовет указанное вами исключение. Это потому, что порядок событий
Это, вероятно, не то, что вы хотите даже без ошибки ... возможно, удалите вызов super или вызов update_canvas в дочернем элементе и настройте свойства, которые вам нужны, в методе update_canvas ПЕРЕД вызовом суперкласса.
Причиной проблемы был класс родительского класса? Спасибо за ваше время. Я понятия не имел, почему все работает, а затем внезапно остановился. БЛАГОДАРЮ ВАС!
Можете ли вы сократить это до минимальный воспроизводимый пример, который могут запускать другие люди, не имея вашего класса
BorderWidget, который все еще воспроизводит проблему? Я не вижу здесь ничего плохого, и я даже сгенерировал фиктивныйBorderWidgetи запустил ваш код против него, и я не получил ошибки.