2016-12-07 6 views
-1

Ну, я хочу добавить меню, но что-то не так.Tkinter в python3, меню не работает

Он говорит: AttributeError: объект 'NoneType' не имеет атрибута 'конфигурации'

Мой код:

from tkinter import * 


class ApplicationWindow(Tk): 

    def __init__(self, master=None): 
     Tk.__init__(self, master) 
     self.master = master 
     self.geometry('800x400') 
     self.f_app = Frame(self).pack() 
     menubar = Menu(self.master) 
     self.master.config(menu=menubar) 

     fileMenu = Menu(menubar) 
     fileMenu.add_command(label="Exit", command=self.onExit) 
     menubar.add_cascade(label="File", menu=fileMenu) 
     self.b_log = Button(self, width=10, text="Войти", command=self.func).pack() 


    def onExit(self): 
     self.quit() 

    def func(self): 
     print("hello") 

def main(): 
    # root = tk 
    app = ApplicationWindow() 
    app.mainloop() 


if __name__ == '__main__': 
    main() 

ответ

1

Вы инициализирует свой ApplicationWindow класс без прохождения каких-либо аргументов в, как этот app = ApplicationWindow(). В вашем методе init, вы даете master с None по умолчанию, и при попытке использовать master.config он говорит

'NoneType' object has no attribute 'config'

Попробуйте передавая аргумент в процессе инициализации экземпляра ApplicationWindow. Независимо от того, что вы хотите master быть (просто не None объект).

Я обновил ваш код (см. Ниже) и он работает. Кнопка работает, и функция выхода закрывает окно. Было много исправления, но оно работает без ошибок. Возьмите его отсюда:

import tkinter 


class ApplicationWindow(tkinter.Tk): 

    def __init__(self, master=None): 
     # Tk.__init__(self, master) 
     self.master = master 
     self.master.geometry('800x400') 
     self.master.f_app = tkinter.Frame(self.master).pack() 
     menubar = tkinter.Menu(self.master) 
     self.master.config(menu=menubar) 

     fileMenu = tkinter.Menu(menubar) 
     fileMenu.add_command(label="Exit", command=self.onExit) 
     menubar.add_cascade(label="File", menu=fileMenu) 
     self.b_log = tkinter.Button(self.master, width=10, text="Войти", command=self.func).pack() 


    def onExit(self): 
     self.master.destroy() 

    def func(self): 
     print("hello") 

def main(): 
    root = tkinter.Tk() 
    app = ApplicationWindow(root) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 
+1

Спасибо, что сработало! – genesi5

1

У вас есть аргумент с именем master=None по умолчанию в None. Поэтому, когда вы создаете экземпляр ApplicationWindow() без параметра, ваш аргумент master получает None, и здесь вы вызываете метод config(), но ваш мастер не имеет значения и у него нет метода с именем config.

class ApplicationWindow(Tk): 
    def __init__(self, master=None): 
     ... 
     self.master.config(menu=menubar) # Error accurred here 

def main(): 
    # root = tk 
    app = ApplicationWindow() # pass an argument 
Смежные вопросы