Python - GTK - апплет похож на ошибку словаря гномов - PullRequest
0 голосов
/ 10 июля 2011

Я новичок в программировании, это мой первый апплет на python-gtk, и я пытаюсь создать апплет, похожий на gnome-dictionary, который получает значение слова с сайта http://www.priberam.pt/dlpo/. Я делаю понемногу, но теперь я застрял, может кто-нибудь помочь мне понять, что я делаю не так?

Я получаю эту ошибку:

"TypeError: необязательный метод enter_callback () должен вызываться с экземпляром x в качестве первого аргумента (вместо этого получен экземпляр Entry)"

Код выглядит следующим образом:

from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup
import urllib2
import re

import HTMLParser
import sys
import gtk
import pango
import string



class x:
    def enter_callback(self, widget, entry):
    entry_text = entry.get_text()
    wordTodefine = entry_text
    url = "http://www.priberam.pt/dlpo/dlpo.aspx?pal="

    url = '{0}{1}'.format(url, wordTodefine)


    g = urllib2.urlopen(url)


    s = g.read()



    def extract(text, sub1, sub2):
        """extract a substring between two substrings sub1 and sub2 in text"""
        return text.split(sub1)[-1].split(sub2)[0]




    str4 = extract(s, ' <?xml version="1.0" encoding="utf-16"?><div><table style="background-color:#eee; width:100%;" cellpadding="4" cellspacing="0" border="0" bordercolor="#cccccc"><tr><td><div>', '<div id="ctl00_ContentPlaceHolder1_pnl_relacionadas">')

    str5 = '{0}{1}{2}'.format('<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><div><table style="background-color:#eee; width:100%;" cellpadding="4" cellspacing="0" border="0" bordercolor="#cccccc"><tr><td><div>', str4, '</html>')

    return str5



class HTMLBuffer(HTMLParser.HTMLParser):
    ignoreTags = ('title', 'table')
    noTagTags = ('html', 'head')
    newlineTags = ('p', 'h1', 'h2', 'li', 'div')
    whiteSpaceNuker = re.compile(r"""\s+""", re.MULTILINE) 
    def __init__(self):
    self.buffer = gtk.TextBuffer()
    self.ignoreData = 0
    self.inList = 0
    self.currentTag = ''
    self.startOfP = 0
    HTMLParser.HTMLParser.__init__(self)
    if gtk.gdk.screen_width() >= 800:
        baseSize = 13
    else:
        baseSize = 10

    baseFont = 'Times'

    tag = self.buffer.create_tag('body')
    tag.set_property('font', '%s %d' % (baseFont, baseSize))

    tag = self.buffer.create_tag('p')
    tag.set_property('pixels-above-lines', 5)
    tag.set_property('pixels-below-lines', 5)

    tag = self.buffer.create_tag('tt')
    tag.set_property('font', 'Times %d' % (baseSize,))

    tag = self.buffer.create_tag('a')
    tag.set_property('font', '%s %d' % (baseFont, baseSize))

    tag = self.buffer.create_tag('h1')
    tag.set_property('font', '%s %d' % (baseFont, baseSize + 10))
    tag.set_property('weight', pango.WEIGHT_BOLD)        

    tag = self.buffer.create_tag('h2')
    tag.set_property('font', '%s %d' % (baseFont, baseSize + 4))
    tag.set_property('weight', pango.WEIGHT_BOLD)

    tag = self.buffer.create_tag('b')
    tag.set_property('weight', pango.WEIGHT_BOLD)

    tag = self.buffer.create_tag('i')
    tag.set_property('style', pango.STYLE_ITALIC)

    tag = self.buffer.create_tag('em')
    tag.set_property('style', pango.STYLE_ITALIC)

    tag = self.buffer.create_tag('ul')
    tag.set_property('left-margin', 20)
    # reset spacing in paragraphs incase this list is inside <p>
    tag.set_property('pixels-above-lines', 0)
    tag.set_property('pixels-below-lines', 0)

    tag = self.buffer.create_tag('li')
    tag.set_property('indent', -9)

    self.iter = self.buffer.get_iter_at_offset(0)
    self.offsets = {}

    def get_buffer(self):
    return self.buffer

    def pushTag(self, tag, offset):
    if self.offsets.has_key(tag):
        self.offsets[tag].append(offset)
    else:
        self.offsets[tag] = [offset]

    def popTag(self, tag):
    if not self.offsets.has_key(tag):
        raise RuntimeError, "impossible"
    return self.offsets[tag].pop()

    # structure markup
    def handle_starttag(self, tag, attrs):
    if tag in self.ignoreTags:
        self.ignoreData += 1
        return
    self.currentTag = tag
    if tag in self.noTagTags:
        return
    self.pushTag(tag, self.iter.get_offset())
    if tag == 'li':
        self.inList += 1
        self.buffer.insert(self.iter, u'\u2022 ')
    elif tag == 'p':
        self.startOfP = 1

    def handle_endtag(self, tag):
    if tag in self.ignoreTags:
        self.ignoreData -= 1
        return
    if tag == 'li':
        self.inList -= 1
    if tag in self.noTagTags:
        return
    offset = self.popTag(tag)
    current = self.iter.get_offset()
    if tag in self.newlineTags and offset != current:
        if tag == 'p' and self.inList:
            offset -= 2
        # put a newline at the beginning
        start = self.buffer.get_iter_at_offset(offset)
        self.buffer.insert(start, '\n')
        offset += 1
        current += 1
        self.iter = self.buffer.get_iter_at_offset(current)
    start = self.buffer.get_iter_at_offset(offset)
    self.buffer.apply_tag_by_name(tag, start, self.iter)

    # all other markup
    def handle_data(self, data):
    if self.ignoreData == 0:
        data = data.replace('\n', ' ')
        data = self.whiteSpaceNuker.sub(' ', data)
        if self.startOfP:
            if data.startswith(' '):
                data = data[1:]
            self.startOfP = 0
        #print '|%s|' % (data,)
        self.buffer.insert(self.iter, data)

if __name__ == '__main__':
    def quit(*args):
    gtk.main_quit()


    buffer = HTMLBuffer()
    buffer.feed(x)
    buffer.close()
#if __name__ == '__main__':
#def __init__():
    window = gtk.Window()
    vbox = gtk.VBox(False, 0)
    view = gtk.TextView()

    view.set_property("editable", False)
    view.set_property("cursor_visible", False)

    entry = gtk.Entry()

    entry.connect("activate", x.enter_callback, entry, view)
    vbox.pack_start(entry, False, False, 0)
    vbox.pack_end(view, False, False, 0)

    window.connect("destroy", lambda w: gtk.main_quit())

    window.add(vbox)
    window.show_all()


x()
gtk.main()

Я использовал HtmlParser, созданный Мэттом Уилсоном, и попытался интегрировать его в мой файл ...

Заранее спасибо, и извините за беспорядок, что этот код.

1 Ответ

0 голосов
/ 13 июля 2011

Почему функция enter_callback является методом класса x?Не похоже, что есть какая-то веская структурная причина для того, чтобы он был в x.Уберите его из x, и сообщение об ошибке исчезнет (сообщение об ошибке сообщает, что self не передается enter_callback).Ну, по крайней мере, этот уйдет, вероятно, будет заменен другим:)

...