2012-12-08 23 views
2

考虑下面的示例代码,这使一个TextView一个窗口内,并注册mark-set事件:Gtk3与Python,TextView的上涨多“标记设置”信号

#!/usr/bin/env python3 

from gi.repository import Gtk 

win = Gtk.Window(title='test') 
text_view = Gtk.TextView() 

def test (*args): 
    print('test!') 

win.add(text_view) 
text_view.get_buffer().connect('mark-set', test) 

win.connect('delete-event', Gtk.main_quit) 
win.show_all() 
Gtk.main() 

如果我启动它,我点击在可视化TextView一次我得到的调试输出多次:

$ ./test.py 2>/dev/null 
test! 
test! 
test! 
test! 

你知道为什么发生这种情况?有没有办法避免它?

回答

0

我不知道为什么究竟它的发生,但我找到了能够帮助您了解,或者用它来防止在处理重复的动作,使用mark.get_name()。在这里,我改变了你的代码,输入了一些文字,然后播放它(选择一些文字,点击某处,...)

#!/usr/bin/env python3 
import time 
from gi.repository import Gtk 

win = Gtk.Window(title='test') 
text_view = Gtk.TextView() 

def mark_set(buf, itr, mark): 
    ### mark.get_name() ==> 'selection_bound' | 'insert' | None 
    print('Time: %.2f, Mark Name: %s'%(time.time()%100, mark.get_name())) 

win.add(text_view) 
text_view.get_buffer().connect('mark-set', mark_set) 

win.connect('delete-event', Gtk.main_quit) 
win.show_all() 
Gtk.main()