2014-12-08 2 views
0

Я пытаюсь создать класс виджетов 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, я был бы признателен за помощь. С уважением, Джордж

+1

Я не думаю, что это является причиной вашей проблемы, но делать 'вар = Widget (любой) .pack()' вызовет переменную 'var' иметь значение' None', потому что 'pack' ничего не возвращает. Назначение и упаковка должны выполняться на отдельных линиях. – Kevin

+0

Отступ неправильный в вашем коде. –

ответ

4
class ScrolledTextComposite(Frame): 
    def __init__(self, parent=NONE): 

NONE это строковая константа, создаваемая Tkinter. Вы хотите встроенный объект None. Кроме того, не забудьте инициализировать значения text1 и text2 перед вызовом makeWidgets.

class ScrolledTextComposite(Frame): 
    def __init__(self, parent=None): 
     Frame.__init__(self, parent) 
     self.pack(expand=YES, fill=BOTH) 
     self.text1 = 'aaaaaa' 
     self.text2 = 'bbbbbbb' 
     self.makeWidgets() 
+0

Привет, Большое спасибо за ваш ответ. Я переупорядочил мои значения text1 и text2, которые в ретроспективе кажутся очевидными. Однако я не совсем понимаю, что вы имеете в виду, когда говорите, что мне нужен встроенный объект None. Не могли бы вы рассказать. Спасибо, George – user3798654

+0

Хорошо. 'None' - это постоянное значение, предоставляемое Python, которое часто используется для представления отсутствия значения, так как аргументы по умолчанию не передаются функции. Вы сами использовали его выше в своей программе, в методе '__init__' для' ScrolledFrame'. Tkinter принимает 'None' как« родительский »параметр для своих классов Widget, в отличие от« NONE », который он отвергает. – Kevin

+0

ОК, я вроде понимаю это, но я не понимаю, как это влияет на мой код ScrolledTextComposite. Похоже, вы говорите, что, определяя parent = None в части __init__ кода ScrolledTextComposite, я запрещаю использовать любые переменные в этом коде? Спасибо за вашу помощь, но я все еще смущен. С уважением, George – user3798654

Смежные вопросы