0

我有一些难以使用搁置模块管理 gtk.view 对象的持久性。

我使用 python 2.6.5 和 PyGtk。

我的第一次测试我用这样的基本对象实现了过程

#!/usr/bin/env python

- - 编码:iso-8859-1 - -

'''test de shelve ''' import gtk import gobject import shelve import os class ShelveDemo(object): def init (self): self.variable1 ='essai' self.variable2 ='1' self.variable3 ='15'自变量4 = 15000

def affiche(self):
    print self.variable1
    print self.variable2
    print self.variable3
    print self.variable4
def save(self,objet):
    save_file = os.path.abspath( "D:\sphinx" + os.sep + 'essai2.tvw')
    db = shelve.open(save_file)
    db['cle1']=objet
    print
    print "liste des clé enregistrée",db.keys
    print
    db.close()
    print('sauvegarde ok')

def load(self):
    save_file = os.path.abspath("D:\sphinx" + os.sep + 'essai2.tvw')

    xx = shelve.open(save_file)
    print
    print "liste des clé loading....",xx.keys
    print
    objet1 = xx['cle1']
    objet1.affiche()
    xx.close()

test = ShelveDemo() test.affiche() test.save(test) test.load()

它运行正常。美好的 !!!!!!!

测试 2 与 textView

#!/usr/bin/env python

- - 编码:iso-8859-1 - -

'''文本小部件/超文本 通常,标签会修改视图中文本的外观,例如使其变为粗体、彩色或带下划线。但标签不限于外观。正如这个演示所示,它们还可以影响鼠标和按键的行为。'''

pygtk 版本:迈克赫塔

import gtk import pango import gobject import shelve_whc as shelve import os from printv import printv class test_affiche: def init (self,bufferr): self.window = gtk.Window() self.window.connect('destroy', lambda *w: gtk.main_quit()) self.window.set_title(self.class ._ name _ +'clone') self.window.set_default_size(450, 450) self.window.set_border_width(0)

    view = gtk.TextView()
    view.set_buffer(bufferr)
    view.set_wrap_mode(gtk.WRAP_WORD) #c'est utile car il y a en permanence une partie cachée pas top pour une aide
    sw = gtk.ScrolledWindow()
    sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    self.window.add(sw)
    sw.add(view)
    self.window.show_all()

类 HypertextDemo(gtk.Window): hovering_over_link = False hand_cursor = gtk.gdk.Cursor(gtk.gdk.HAND2) regular_cursor = gtk.gdk.Cursor(gtk.gdk.XTERM) def save(self,bufferr): save_file = os .path.abspath("D:\sphinx" + os.sep + 'essai.tvw') db = shelve.open(save_file,protocol=2) # protocol=2 est nécessaire pour traiter objet complexe type TextBuffer printv (buffer) print type(buffer) db['cle']=bufferr db.close() print('sauvegarde ok') # fonction de test pour savoir ce que je sauvegarde essai = test_affiche(bufferr) printv(bufferr)

def load(self):
    save_file = os.path.abspath("D:\sphinx" + os.sep + 'essai.tvw')
    db = shelve.open(save_file,protocol=2) # protocol=2 est nécessaire pour traiter objet complexe type TextBuffer
    print
    print "liste des clé enregistrée",db.keys()
    print
    conteneur = db['cle']
    print "type de l'objet en cours de chargement %s" %type(conteneur)
    print "nom  de l'objet en cours de chargement %s" %conteneur.__class__.__name__
    printv (conteneur)
    # fonction de test pour savoir ce que je sauvegarde
    essai3 = test_affiche(conteneur)
    db.close()

def __init__(self, parent=None):
    gtk.Window.__init__(self)
    try:
        self.set_screen(parent.get_screen())
    except AttributeError:
        self.connect('destroy', lambda *w: gtk.main_quit())
    self.set_title(self.__class__.__name__)
    self.set_default_size(450, 450)
    self.set_border_width(0)
    view = gtk.TextView()
    view.set_wrap_mode(gtk.WRAP_WORD) #c'est utile car il y a en permanence une partie cachée pas top pour une aide
    view.connect("key-press-event", self.key_press_event)
    view.connect("event-after", self.event_after)
    view.connect("motion-notify-event", self.motion_notify_event)
    view.connect("visibility-notify-event", self.visibility_notify_event)
    buffer = view.get_buffer()
    sw = gtk.ScrolledWindow()
    sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    self.add(sw)
    sw.add(view)
    self.show_page(buffer, 1)
    self.show_all()
    self.save(view.get_buffer())
    self.load()
# Links can be activated by pressing Enter.
def key_press_event(self, text_view, event):
    if (event.keyval == gtk.gdk.Return or
        event.keyval == gtk.gdk.KP_Enter):
        buffer = text_view.get_buffer()
        iter = buffer.get_iter_at_mark(buffer.get_insert())
        self.follow_if_link(text_view, iter)
    return False
# Links can also be activated by clicking.
def event_after(self, text_view, event):
    if event.type != gtk.gdk.BUTTON_RELEASE:
        return False
    if event.button != 1:
        return False
    buffer = text_view.get_buffer()
    # we shouldn't follow a link if the user has selected something
    try:
        start, end = buffer.get_selection_bounds()
    except ValueError:
        # If there is nothing selected, None is return
        pass
    else:
        if start.get_offset() != end.get_offset():
            return False
    x, y = text_view.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET,
        int(event.x), int(event.y))
    iter = text_view.get_iter_at_location(x, y)
    self.follow_if_link(text_view, iter)
    return False

# Looks at all tags covering the position (x, y) in the text view,
# and if one of them is a link, change the cursor to the "hands" cursor
# typically used by web browsers.
def set_cursor_if_appropriate(self, text_view, x, y):
    hovering = False
    buffer = text_view.get_buffer()
    iter = text_view.get_iter_at_location(x, y)
    tags = iter.get_tags()
    for tag in tags:
        page = tag.get_data("page")
        if page != 0:
            hovering = True
            break
    if hovering != self.hovering_over_link:
        self.hovering_over_link = hovering
    if self.hovering_over_link:
        text_view.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(self.hand_cursor)
    else:
        text_view.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(self.regular_cursor)
# Update the cursor image if the pointer moved.
def motion_notify_event(self, text_view, event):
    x, y = text_view.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET,
        int(event.x), int(event.y))
    self.set_cursor_if_appropriate(text_view, x, y)
    text_view.window.get_pointer()
    return False
# Also update the cursor image if the window becomes visible
# (e.g. when a window covering it got iconified).
def visibility_notify_event(self, text_view, event):
    wx, wy, mod = text_view.window.get_pointer()
    bx, by = text_view.window_to_buffer_coords(gtk.TEXT_WINDOW_WIDGET, wx, wy)
    self.set_cursor_if_appropriate (text_view, bx, by)
    return False
def insert_link(self, buffer, iter, text, page):
    ''' Inserts a piece of text into the buffer, giving it the usual
        appearance of a hyperlink in a web browser: blue and underlined.
        Additionally, attaches some data on the tag, to make it recognizable
        as a link.
    '''
    tag = buffer.create_tag(None,
        foreground="blue", underline=pango.UNDERLINE_SINGLE)
    tag.set_data("page", page)
    buffer.insert_with_tags(iter, text, tag)

def show_page(self, buffer, page):
    ''' Fills the buffer with text and interspersed links. In any real
        hypertext app, this method would parse a file to identify the links.
    '''
    buffer.set_text("", 0)
    iter = buffer.get_iter_at_offset(0)
    if page == 1:
        buffer.insert(iter, "Some text to show that simple ")
        self.insert_link(buffer, iter, "hypertext", 3)
        buffer.insert(iter, " can easily be realized with ")
        self.insert_link(buffer, iter, "tags", 2)
        buffer.insert(iter, ".")
        buffer.insert(iter, "\n")
        buffer.insert(iter, 'Inserts a piece of text into the buffer, giving it the usual'
        'appearance of a hyperlink in a web browser: blue and underlined.'
        'Additionally, attaches some data on the tag, to make it recognizable'
        'as a link')
        buffer.insert(iter, "\n")
        buffer.insert(iter, 'Inserts a piece of text into the buffer, giving it the usual'
        'appearance of a hyperlink in a web browser: blue and underlined.'
        'Additionally, attaches some data on the tag, to make it recognizable'
        'as a link')
    elif page == 2:
        buffer.insert(iter,
            "A tag is an attribute that can be applied to some range of text. "
            "For example, a tag might be called \"bold\" and make the text inside "
            "the tag bold. However, the tag concept is more general than that "
            "tags don't have to affect appearance. They can instead affect the "
            "behavior of mouse and key presses, \"lock\" a range of text so the "
            "user can't edit it, or countless other things.\n", -1)
        self.insert_link(buffer, iter, "Go back", 1)
    elif page == 3:
        tag = buffer.create_tag(None, weight=pango.WEIGHT_BOLD)
        buffer.insert_with_tags(iter, "hypertext:\n", tag)
        buffer.insert(iter,
            "machine-readable text that is not sequential but is organized "
            "so that related items of information are connected.\n")
        self.insert_link(buffer, iter, "Go back", 1)

def follow_if_link(self, text_view, iter):
    ''' Looks at all tags covering the position of iter in the text view,
        and if one of them is a link, follow it by showing the page identified
        by the data attached to it.
    '''
    tags = iter.get_tags()
    for tag in tags:
        page = tag.get_data("page")
        if page != 0:
            self.show_page(text_view.get_buffer(), page)
            break

定义主():

HypertextDemo()
gtk.main()

如果名称== '主要':

main()

关于测试 2,如果没有发生持久性动作,重新加载动作就不行

我可以有一些解释是我的错误提前谢谢你的帮助

4

1 回答 1

0

嗨 对不起 对其他人来说是一个小错误

将 import shelve_whc 替换为 shelve

通过进口货架

于 2011-02-13T14:27:00.407 回答