2015-08-28 6 views
1

У меня есть два callbacks, установленных для щелкнутого сигнала на кнопке done. Есть ли способ вынуть (не выполнить) один из них, например.Уничтожение старого обратного вызова для кнопки и установка нового

import threading 
import time 
from gi.repository import Gtk, GLib 

class Test(): 
    def __init__(self): 

     win = Gtk.Window() 
     win.set_title("XYZ") 

     win.set_border_width(10) 

     box = Gtk.VBox(spacing=10) 
     win.add(box) 
     done_button = Gtk.Button(label="DONE") 
     done_button.connect("clicked", self.callback1) 

     #remove callback ??? callback1 should not be called when button is clicked. 

     done_button.connect("clicked", self.callback2) 

     box.pack_end(done_button, False, False, 0) 

     win.show_all() 
     win.maximize() 
     win.connect("delete-event", Gtk.main_quit) 

    def callback1(self, widget): 
     print "callback1" 

    def callback2(self, widget): 
     print "callback2" 


if __name__ == '__main__': 
    test = Test() 
    Gtk.main() 

Что можно сделать для удаления callback1.

ответ

2

вам необходимо получить идентификатор сигнала для того, чтобы иметь возможность отключить его, так изменить подключение к:

b_id = done_button.connect("clicked", self.callback1) 

, а затем использовать функцию отключения модуля GObject:

GObject.signal_handler_disconnect(done_button, b_id) 

или как это было предложено elya5 (так что вам даже не придется импортировать GObject):

done_button.disconnect(b_id) 

Remem ber для импорта модуля GObject (не GLib)

from gi.repository import Gtk, GObject 
+1

Вы можете достичь этого, используя 'done_button.disconnect (handler_id)'. Тогда вам не нужен импорт GObject. 'id' также является встроенной функцией python, поэтому вы должны придерживаться другого имени. – elya5