Gtk3 с Python, TextView повышает несколько сигналов «установки меток»

Рассмотрим следующий пример кода, который помещает TextView в окно и регистрирует событие mark-set:

#!/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!

Вы знаете, почему это происходит? Есть ли способ избежать этого?


person Dacav    schedule 08.12.2012    source источник


Ответы (1)


Я не знаю, почему именно это происходит, но я нашел кое-что, что поможет вам понять или использовать это для предотвращения дублирования действий в обработчике, используя 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()
person saeedgnu    schedule 11.07.2015