2016-07-11 4 views
1

Я пытаюсь использовать объектно-ориентированный подход для создания класса, который наследуется от Toplevel tkinter, запускаемого нажатием кнопки в главном окне.Python tkinter - успешно наследовать от toplevel

В текущем коде возникает объект AttributeError (объект 'MakeWindow' не имеет атрибута 'tk'). Может кто-то указать мне верное направление?

#! python3 
import tkinter as tk 


class Application: 
    def __init__(self, master): 
     self.frame = tk.Frame(master) 
     self.frame.pack()  
     self.okButton = tk.Button(self.frame, text="OK", 
            command=self.window_maker).pack() 
     self.quitButton = tk.Button(self.frame, text="Close", 
            command=self.frame.quit).pack() 
    def window_maker(self): 
     MakeWindow("A message to Toplevel") 


class MakeWindow(tk.Toplevel): 
    def __init__(self, message): 
     super().__init__(self) 
     self.message = message 
     self.display = tk.Label(self, text=message) 
     self.display.pack() 


if __name__ == '__main__': 
    root = tk.Tk() 
    app = Application(root) 
    root.mainloop() 

Полный отслеживающий:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\r\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1550, in __call__ 
    return self.func(*args) 
    File "C:/Users/r/PycharmProjects/tkinter_gui/y.py", line 15, in window_maker 
    MakeWindow("A message to Toplevel") 
    File "C:/Users/r/PycharmProjects/tkinter_gui/y.py", line 20, in __init__ 
    super().__init__(self) 
    File "C:\Users\r\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2182, in __init__ 
    BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra) 
    File "C:\Users\r\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2132, in __init__ 
    BaseWidget._setup(self, master, cnf) 
    File "C:\Users\r\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2110, in _setup 
    self.tk = master.tk 
AttributeError: 'MakeWindow' object has no attribute 'tk' 
+0

Не могли бы вы дать полный след и исправить отступы? – jonrsharpe

+1

У вас есть простая опечатка - 'super() .__ init __()' будет работать нормально. На данный момент вы предоставляете новый экземпляр «MakeWindow» как «мастер», чего не может быть. – jonrsharpe

+0

Это работает, спасибо! – qmsack

ответ

1

Проблема заключается в super().__init__(self) она должна быть super().__init__(). Кроме того, в этом случае не обязательно использовать super (см. What does 'super' do in Python?). Работает следующий код:

import tkinter as tk 


class Application: 
    def __init__(self, master): 
     self.frame = tk.Frame(master) 
     self.frame.pack()  
     self.okButton = tk.Button(self.frame, text="OK", 
            command=self.window_maker).pack() 
     self.quitButton = tk.Button(self.frame, text="Close", 
            command=self.frame.quit).pack() 
    def window_maker(self): 
     MakeWindow("A message to Toplevel") 


class MakeWindow(tk.Toplevel): 
    def __init__(self, message): 
     tk.Toplevel.__init__(self) #instead of super 
     self.message = message 
     self.display = tk.Label(self, text=message) 
     self.display.pack() 


if __name__ == '__main__': 
    root = tk.Tk() 
    app = Application(root) 
    root.mainloop() 
+0

Почему бы вам не использовать 'super'? Вам это не нужно, но это намного опрятно. – jonrsharpe

+0

Спасибо, поэтому, если я использую super() no 'self', tk.Toplevel .__ init __ (self) требует «self». Pycharm жалуется на последнее («Ожидаемый тип« Топлевель », но вместо этого« Make Window »), но он отлично работает. Спасибо, спасибо за ссылку! – qmsack