2012-12-08 24 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()