2015-05-01 3 views
-4

Это мой код, и я хочу, чтобы удалить кадр .__ init_ часть:Удалить фрейм .__ init__ в python?

class Black(Frame): 
    def __init__(self, parent, width, height,): 
     Frame.__init__(self,parent, bg='black') 
     self.width = width 
     self.height = height 

Когда я удалить его вручную, я получаю ошибку:

AttributeError: 'Black' object has no attribute 'tk' 

Я думаю, что это будет небольшой и глупая ошибка. Может кто-нибудь мне помочь?

+1

Почему вы думаете, что можете удалить его? Вы не можете, это инициализатор класса «Frame», который заставляет ваш объект работать. –

+0

Если вы удалите его, вы должны его заменить 'super (Black, self) .__ init __ (parent, bg = 'black')' ... – glglgl

+0

@glglgl Фактически, в 2.x это не будет работать, потому что почти все Tkinter - это классы старого стиля. – abarnert

ответ

4

Класс Black получен из класса Frame, а ваш __init__() переопределяет класс базового класса.

Для правильной инициализации объекта вам понадобится Frame.__init__(self,parent, bg='black').

Посмотрите на docs и прочитать о наследовании для более подробного объяснения того, что происходит на

+0

Что делать, если я ХОЧУ УДАЛИТЬ это и создать кадр в этом классе? –

+0

Возможно ли это? –

+2

Все возможно. Я думаю, вам нужно прочитать и понять концепцию наследования. Это важно, и не очень сложно. Здесь неплохой путеводитель: http: //www.jesshamrick.com/2011/05/18/an-introduction-to-classes-and-inheritance-in-python/ – SiHa

1

Если вы не хотите бытьFrame, но вместо этого хочет собственного один, вы не должны» t наследуется от него. Просто хранить один в качестве атрибута:

class Black(object): # note no inheritance from Frame 
    def __init__(self, parent, width, height,) 
     # instance of calling its __init__ with self, 
     # we just construct a Frame and store it 
     self.frame = Frame(parent, bg='black') 
     self.width = width 
     self.height = height 

Теперь, чтобы позвонить Frame методы, вы self.frame.spam(), не self.spam() и так далее.


Если вы хотите поддельных будучи Frame не будучи один, только иметь одно, вы можете сделать это путем делегирования каждого Frame метода и приписывать self.frame (явно или через __getattr__); вы можете даже подделать isinstance, если вам действительно нужно. Но это расширенный вариант использования, и вам нужно изучить немного сложного материала, чтобы он работал плавно, поэтому, надеюсь, это не то, что вы хотите.

+0

thnx. но i hv 'game = Black (root, width = 10, height = 10)' 'game.mainloop()' в конце моего кода –

+0

, так что ошибка в черном объекте не имеет атрибута mainloop –

+0

@StephannieMerok Конечно. Вы можете только называть 'mainloop' виджета Tkinter, а' game' - не один, потому что вы не хотите, чтобы он был одним, поэтому вы не можете называть 'mainloop' на нем. Если я не пойму, почему вы не хотите, чтобы 'игра' была объектом' Frame', то почти невозможно предложить, что вы здесь делаете. Возможно, это просто вызов mainloop на корневом объекте или, может быть, на 'game.frame', но есть еще миллион других возможностей, и я понятия не имею, какой из них вы хотите. – abarnert

Смежные вопросы