Я пытаюсь создать класс виджетов Tkinter с использованием существующего класса виджета Tkinter. Мой существующий класс виджетов Tkinter - это класс прокрученного текстового виджета, а класс виджета, который я пытаюсь создать, использует мой существующий класс прокрученных текстовых виджета для создания виджета, который объединяет два существующих виджета с прокруткой текста для создания единого составного виджета. Я написал код, который кажется близким к правильному, но дает мне сообщение об ошибке. Вот мой существующий функционал прокручивать текст кода класса виджета:Создайте класс виджета Tkinter из другого класса виджетов Tkinter
class ScrolledText(Frame):
def __init__(self, parent=None, text='', file=None, width='', height=''):
Frame.__init__(self, parent)
self.pack(expand=YES, fill=BOTH) # make me expandable
self.width = width
self.height = height
self.makewidgets()
self.settext(text, file)
def makewidgets(self):
sbar = Scrollbar(self)
text = Text(self, relief=SUNKEN, width=self.width, height=self.height)
sbar.config(command=text.yview) # xlink sbar and text
text.config(yscrollcommand=sbar.set) # move one moves other
sbar.pack(side=RIGHT, fill=Y) # pack first=clip last
text.pack(side=LEFT, expand=YES, fill=BOTH) # text clipped first
self.text = text
def settext(self, text='', file=None):
if file:
text = open(file, 'r').read()
self.text.delete('1.0', END) # delete current text
self.text.insert('1.0', text) # add at line 1, col 0
self.text.mark_set(INSERT, '1.0') # set insert cursor
self.text.focus() # save user a click
def gettext(self): # returns a string
return self.text.get('1.0', END+'-1c') # first through last
Вот код, который я написал, что делает новый прокручивать текст виджет, который является составным из двух существующих прокручивается текстовых виджетов:
class ScrolledTextComposite(Frame):
def __init__(self, parent=NONE):
Frame.__init__(self, parent)
self.pack(expand=YES, fill=BOTH)
self.makeWidgets()
self.text1 = 'aaaaaa'
self.text2 = 'bbbbbbb'
def makeWidgets(self):
try:
self.top = ScrolledText(self, file=sys.argv[1], width= 50, height=15).pack()
except IndexError:
self.top = ScrolledText(self, text= self.text1, width= 50, height=15).pack()
try:
self.bot = ScrolledText(self,file=sys.argv[1], width=50, height=15).pack()
except IndexError:
self.bot = ScrolledText(self, text= self.text2, width=50, height=15).pack()
Модифицированный класс виджета ScrolledText создает текстовый виджет, который прокручивает и позволяет вводить текст в текстовом виджетах как в виде файла, так и в виде текстовой строки. В этом случае я использую текстовую строку, а не файл для источника текста, который будет отображаться. Пробовать кроме операторов в части makeWidget класса ScrolledTextComposite является результатом способности класса ScrolledText обрабатывать либо файл, либо текстовую строку в качестве входных данных. Вот выражение MainLoop, что рисует новый композиционный прокручивать текст виджет:
ScrolledTextComposite().mainloop()
Когда я запускаю этот код, я получаю следующее сообщение об ошибке:
AttributeError: 'str' object has no attribute 'tk'
Я считаю, что эта ошибка была вызвана как Я кодирую класс ScrolledTextComposite для ввода текстовой строки, которая будет отображаться в отдельных текстовых виджетах, из которых состоит виджет ScrolledTextComposite. Если у кого-нибудь есть идеи, как правильно выполнить функцию класса ScrolledTextComposite, я был бы признателен за помощь. С уважением, Джордж
Я не думаю, что это является причиной вашей проблемы, но делать 'вар = Widget (любой) .pack()' вызовет переменную 'var' иметь значение' None', потому что 'pack' ничего не возвращает. Назначение и упаковка должны выполняться на отдельных линиях. – Kevin
Отступ неправильный в вашем коде. –