【发布时间】:2011-06-24 03:56:03
【问题描述】:
我有一些难以使用搁置模块管理 gtk.view 对象的持久性。
我使用 python 2.6.5 和 PyGtk。
我的第一次测试 我用这样的基本对象实现了流程
#!/usr/bin/env python
-- 编码:iso-8859-1 --
'''测试搁置 ''' 导入gtk 导入对象 进口货架 导入操作系统 类 ShelveDemo(对象): def 初始化(自我): self.variable1 ='essai' self.variable2 ='1' self.variable3 ='15' self.variable4 =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()
测试 = ShelveDemo() 测试.affichi() 测试.保存(测试) test.load()
运行正常。很好!!!!!!!
使用 textView 测试 2
#!/usr/bin/env python
-- 编码:iso-8859-1 --
'''文本小部件/超文本 通常,标签会修改视图中文本的外观,例如进行中 粗体或彩色或下划线。但标签不限于外观。 它们还可以影响鼠标和按键的行为,就像这个演示一样 '''
pygtk 版本:迈克柏林赫塔
导入gtk 进口潘戈 导入对象 导入 shelve_whc 作为搁置 导入操作系统 从 printv 导入 printv 类 test_affichi: def init(self,buffer): 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()
类超文本演示(gtk.Window): hovering_over_link = 假 hand_cursor = gtk.gdk.Cursor(gtk.gdk.HAND2) regular_cursor = gtk.gdk.Cursor(gtk.gdk.XTERM) def 保存(自我,缓冲区): 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(缓冲区) 打印类型(缓冲区) db['cle']=缓冲区 db.close() print('sauvegarde ok') # fonction de test pour savoir ce que je sauvegarde essai = test_affiche(缓冲区) printv(缓冲区)
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
def main():
HypertextDemo()
gtk.main()
如果 name == 'main':
main()
关于测试 2,如果不发生持久性操作,重新加载操作是不正确的
我能解释一下吗是我的错误 提前感谢您的帮助
【问题讨论】:
标签: python-module