Tkinter: AttributeError: у объекта 'NoneType' нет атрибута '_root' - PullRequest
0 голосов
/ 03 марта 2019

Я изучаю Tkinter и пытаюсь использовать ООП подход при разработке простого графического интерфейса.

Я создаю класс, который наследуется от tkinter.Frame, а также реализует мои специфические функции.

Я пытаюсь определить tkinter.StringVar () вне функции init моего класса, и я получаю ошибку, описанную в заголовке.Теперь я знаю, что у меня должна быть переменная внутри метода init , и я заставил ее работать. Я просто хочу понять, почему она не работает, если я объявил ее как переменную класса.

Iпонимать, что tk.StringVar () должен иметь контекст tk.Tk () для возможности запуска.Так что это должно (и действительно так) компилироваться без ошибок:

root = tk.Tk()
str = tk.StringVar()
root.mainloop()

Если я напишу так, как это, то это даст упомянутую ошибку:

class myClass(tk.Frame):
    def __init__(self, master):
        super(myClass, self).__init__(master)
        pass
    str=tk.StringVar()

root = tk.Tk()
inst = myClass(root)

Так что это если бы япопробуйте написать tk.StringVar (), не создавая сначала root = tk.Tk ().Но, насколько я понимаю, контекст tk.Tk () создается до того, как я создаю экземпляр 'inst', поэтому к тому времени, когда интерпретатор входит в класс и видит, что переменная класса 'str' уже должна была запустить tk.Tk ().Очевидно, я что-то упустил.Пожалуйста, объясните мне последовательность, в которой все происходит, и почему root.Tk () не выполняется, прежде чем я попытаюсь создать переменную tk.StringVar ().Спасибо.

Редактирование: строка str = tk.StringVar () является частью тела класса и, следовательно, выполняется во время определения класса - что происходит до того, как будет создан экземпляр Tk ().Спасибо @jasonharper за ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...