Ошибка говорит вам, что вы пытаетесь вызвать insert
для объекта, который None
. Итак, давайте посмотрим, куда вы звоните insert
:
textBoxClass(self.parent).textDropIn(self.parent).insert(tk.INSERT,"This is the text to add.")
На основании сообщения об ошибке мы должны сделать вывод, что textBoxClass(self.parent).textDropIn(self.parent)
равно None
. И конечно же, когда мы смотрим на определение метода textDropIn
, он явно ничего не возвращает. Поскольку он явно ничего не возвращает, он вернет None
. Таким образом, код такой же, как если бы вы сделали None.insert(...)
, и, следовательно, ошибка, которую вы получаете.
Есть два очевидных решения. Если вы хотите иметь возможность связывать методы вместе, как это (например: .textDropIn(...).insert(...)
), вам нужно убедиться, что каждый шаг в цепочке возвращает исходный объект. Вы можете сделать это так:
def someFunction(self):
#otherstuff
textBoxClass(self.parent).textDropIn(self.parent).insert(tk.INSERT,"This is the text to add.")
return self
Другой метод состоит в том, чтобы разбить одно длинное утверждение на два:
textBoxClass(self.parent).textDropIn(self.parent)
textboxClass(self.parent).insert(tk.INSERT,"This is the text to add.")
Однако , это неправильный способ вызова textDropIn
и insert
. Вместо этого вам нужно вызывать его непосредственно в экземпляре класса. К сожалению, вы не сохраняете ссылку на экземпляр, поэтому сначала нужно исправить это, сохранив экземпляр:
class someGui(tk.Tk):
def __init__(self,parent):
self.parent=parent
self.Window()
self.textBox = textBoxClass(self.parent)
Затем вы можете вызвать методы этого экземпляра:
def someFunction(self):
#otherstuff
self.textBox.textDropIn(self.parent)
self.textbox.insert(tk.INSERT,"This is the text to add.")
Поскольку вы никогда не используете атрибут parent
в textDropIn
, я рекомендую удалить этот параметр как из определения, так и из вызова.
Кроме того, ваш код будет легче понять, если вы начнете все имена классов с заглавной буквы. Вы должны изменить textBoxClass
на TextBoxClass
и someGui
на SomeGui
. Это соглашение об именах является универсальным в мире Python. Для получения дополнительной информации о стандартных соглашениях об именах см. PEP8 .
Есть еще одна проблема. textBoxClass
наследуется от ScrolledText
и создает его экземпляр. Вы должны сделать одно или другое. Я не могу точно сказать, что вы пытаетесь достичь, но обычный способ расширения существующего класса - это что-то вроде этого (обратите внимание на пользователя super
):
class textBoxClass(tkst.ScrolledText):
def __init__(self,parent):
self.root=parent
super().__init__(self, parent)
self.textDropIn(self.root)
Еще одна проблема в коде заключается в том, что вы импортируете tkinter дважды:
from tkinter import *
...
import tkinter as tk
Это делает ваш код очень сложным для понимания. Вам нужно выбрать один метод импорта и придерживаться его. Лично я считаю, что вторая версия является лучшей, поскольку она соответствует PEP8, а также дзену Python (явное лучше, чем неявное).
Наконец, есть еще одна проблема. Вы создаете два корневых окна, и программа tkinter может иметь только одно (за исключением очень необычных обстоятельств, а это не так). Один создается, когда вы делаете root = tk.Tk()
, а второй - когда вы делаете sg=someGui(root)
, поскольку someGui
наследуется от tk.Tk
. Чтобы усугубить проблему, вы неправильно вызываете метод суперкласса __init__
, поэтому экземпляр someGui
не создан должным образом. В этом корень ошибки рекурсии, о которой вы писали в своем обновлении.