2011-07-10 9 views
0

私はプログラマブルで初めてです。これは私の最初のpython-gtkアプレットで、gnome-dictionaryと似たアプレットを作って、 http://www.priberam.pt/dlpo/。私は少しずつしていますが、今私は立ち往生しています、誰かが私が間違っていることを見て助けることができますか?Python - GTK - gnome辞書エラーと似たアプレット

私はこのエラーを取得する:

"はTypeError:未結合の方法enter_callback()最初の引数としてのxインスタンスで呼び出さなければなりません(代わりにエントリのインスタンスを得た)" は以下のよう

コードは次のとおりです。

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を使用して、私のファイルでそれを統合しようとした...事前に

おかげで、及び第混乱して申し訳ありませんコードはです。

答えて

0

なぜ関数enter_callbackは、クラスxのメソッドですか?それは最初にxにあるためにそれが良い構造的理由があるようには思われません。 xから取り出し、エラーメッセージが表示されなくなります(selfenter_callbackに渡されていないというエラーメッセージが表示される)。まあ、少なくともこの1つは、おそらく別のものに置き換えられます:)

+0

あなたの助けに感謝ジェレミー。たぶん私はまず難しいものを試したことがあります。私はすべてをリメイクします、それは本当に悪いです。おそらく私は 'enter_callback'関数の中でそれをすべて作ります。 – Unkuiri