2013-08-11 1 views
4

Пытается создать окно Tkinter с помощью функции super(). я получаю эту ошибку:Python 2.7 super() error

супер (Application, самостоятельная) ._ INIT _ (мастер) TypeError: должен быть типа, не classobj

Код:

import Tkinter as tk 

class Application(tk.Frame): 

    def __init__(self, master): 
     super(Application, self).__init__(master) 
     self.grid() 


def main(): 
    root = tk.Tk() 
    root.geometry('200x150') 
    app = Application(root) 

    root.mainloop() 


main() 

ответ

4

Tkinter использует классы старого стиля. super() может использоваться только с new-style classes.

+0

Так что я должен сделать это: ** tk.Frame .__ init __ (self, master) ** вместо super()? – user1121487

+0

Это правильно. –

8

Хотя это правда, что Tkinter использует классы старого стиля, это ограничение может быть преодолено путем дополнительного получения подкласса Application из object (используя Python множественное наследование):

import Tkinter as tk 

class Application(tk.Frame, object): 

    def __init__(self, master): 
     super(Application, self).__init__(master) 
     self.grid() 

def main(): 
    root = tk.Tk() 
    root.geometry('200x150') 
    app = Application(root) 

    root.mainloop() 

main() 

Это будет работать до тех пор, как Класс Tkinter не пытается выполнить какое-либо поведение, которое требует использования класса старого стиля (что я очень сомневаюсь в этом). Я протестировал вышеприведенный пример с Python 2.7.7 без каких-либо проблем.

Эта работа была предложена here. Это поведение также включено по умолчанию в Python 3 (ссылка на ссылку).