Проблема с модулем Python - PullRequest
0 голосов
/ 17 мая 2011

У меня есть два файла .py, которые называются "notepad.py" и "pycolour.py".Первый находится в родительской папке, второй - в папке «subdir».Первый файл:

#notepad.py
from Tkinter import *
from subdir import pycolour

class SimpleNotepad(object):

    def __init__(self):
        self.frame = Frame(root, bg='#707070', bd=1)
        self.text_field = Text(self.frame, font='Verdana 10', bd=3, wrap='word')
        self.text_field.focus_set()
        self.btn = Button(root, text='try to colour', command=self.try_to_colour)

        self.coloured = pycolour.PyColour(root)

        self.frame.pack(expand=True, fill='both')
        self.text_field.pack(expand=True, fill='both')
        self.btn.pack()

    def try_to_colour(self):
        txt = self.text_field.get(1.0, 'end')
        text = str(txt).split('\n')
        for i in range(len(text)-1):
            self.coloured.colourize(i+1, len(text[i]))

root = Tk()
app = SimpleNotepad()
root.mainloop()

Второй файл:

#pycolour.py
from Tkinter import *
import keyword

#colorizing the Python code
class PyColour(Text):

    def __init__(self, parent):
        Text.__init__(self, parent)
        self.focus_set()
        self.tag_conf()

        self.bind('<Key>', self.key_pressed)

    tags = {'com' : '#009999',   #comment is darkgreen
            'str' : '#F50000',   #string is red
            'kw'  : '#F57A00',   #keyword is orange
            'obj' : '#7A00F5',   #function or class name is purple
            'int' : '#3333FF'    #integers is darkblue
            }

    def tag_conf(self):
        for tag, value in self.tags.items():
            self.tag_configure(tag, foreground=value)

    def tag_delete(self, start, end):
        for tag in self.tags.items():
            self.tag_remove(tag, start, end)

    def key_pressed(self, key):
        if key.char in ' :[(]),"\'':
            self.edit_separator() #for undo/redo

        cline = self.index(INSERT).split('.')[0]
        lastcol = 0
        char = self.get('%s.%d'%(cline, lastcol))
        while char != '\n':
            lastcol += 1
            char = self.get('%s.%d'%(cline, lastcol))

        self.colourize(cline,lastcol)

    def colourize(self, cline, lastcol):
        buffer = self.get('%s.%d'%(cline,0),'%s.%d'%(cline,lastcol))
        tokenized = buffer.split(' ')

        self.tag_remove('%s.%d'%(cline, 0), '%s.%d'%(cline, lastcol))

        quotes = 0
        start = 0
        for i in range(len(buffer)):
            if buffer[i] in ['"',"'"]:
                if quotes:
                   self.tag_add('str', '%s.%d'%(cline, start), '%s.%d'%(cline, i+1))
                   quotes = 0
                else:
                    start = i
                    quotes = 1
            elif buffer[i] == '#':
                self.tag_add('com', '%s.%d'%(cline, i), '%s.%d'%(cline, len(buffer)))
                break

        start, end = 0, 0
        obj_flag = 0
        for token in tokenized:
            end = start + len(token)+1
            if obj_flag:
                self.tag_add('obj', '%s.%d'%(cline, start), '%s.%d'%(cline, end))
                obj_flag = 0
            if token.strip() in keyword.kwlist:
                self.tag_add('kw', '%s.%d'%(cline, start), '%s.%d'%(cline, end))
                if token.strip() in ['def','class']: obj_flag = 1
            else:
                for index in range(len(token)):
                    try: int(token[index])
                    except ValueError: pass
                    else: self.tag_add('int', '%s.%d'%(cline, start+index))
            start += len(token)+1

if __name__ == '__main__':
    root = Tk()
    st = PyColour(root)
    st.pack(fill='both', expand='yes')
    root.mainloop()

"pycolour.py" окрашивает синтаксис python в своем собственном текстовом виджете.Я хочу раскрасить синтаксис Python в текстовом виджете с именем «text_field» из «notepad.py», поэтому я написал try_to_colour функцию.проблема в том, что я не понимаю, почему эта функция не работает должным образом.

Ответы [ 2 ]

1 голос
/ 19 мая 2011

PyColour это класс. Чтобы воспользоваться преимуществами того, что он делает, вы должны либо создать его экземпляр (например, self.text_field = PyColour(...)), либо создать свой собственный класс, который подклассирует класс PyColour (например, class MyPyColour(PyColour): ...; self.text_field = MyPyColour(...))

0 голосов
/ 17 мая 2011

PyColour - это не служебный класс, а Text виджет.Это может только раскрасить себя.Поэтому вам нужно заменить

self.text_field = Text(self.frame, ....)

на

self.text_field = PyColor(self.frame)
# find a different way to set font, etc.

Проблема в том, что PyColor вызывает self.tag_add() и подобные методы в colourize().Они работают только на PyColor экземпляре self, а не на вашем виджете.

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