2012-09-06 23 views
2

我可能在我的pygtk编程中缺少一些基本的东西,但我想要将信号连接到一个gtk.Entry,然后让它只发出连接的信号,当我允许它这样做。手动切换小部件在pygtk中发出信号的能力

也就是说,我要的东西在这个最小的代码(仅适用于交互式使用)添加到toggle_signalling使Hello只印信令“允许”时:

import gtk 

signal_states = ['On', 'Off'] 
signal_state = True 

def reporter_function(*args,**kwargs): 
    print "Hello" 

def toggle_signaling(widget, **kwargs): 
    global signal_state 
    signal_state = not signal_state 
    widget.set_label(signal_states[signal_state]) 
    print ['Emit allowed', 'Emit not allowed'][not signal_state] 

w = gtk.Window() 
e = gtk.Entry() 
b = gtk.Button(label=signal_states[signal_state]) 

hbox = gtk.HBox() 
hbox.pack_start(e) 
hbox.pack_end(b) 

e.connect("changed", reporter_function) 
b.connect("clicked", toggle_signaling) 
w.add(hbox) 
w.show_all() 

我以前让有是这种发送信号状态的布尔标志,例如self._updating在我的自定义小部件类中,并让回调函数在做任何事之前检查这个状态。这不是我想要的。

我想要一个gtk原生的方式让小部件知道它不应该发送信号(当我点击示例中的按钮时)。我很确定我已经偶然发现了一次这样做,但我迷失了再次找到它。

另外,要明确地说,仍然必须允许启用小部件。

回答

3

我不认为有布尔标志周围的方法。是否允许小部件发出信号是附加的应用逻辑,因此必须保存在某个地方。
根据您之前对该主题的研究和相当详细描述的功能,您很可能在寻找chapter 20.1.2 of the PyGTK tutorial
我将全面的示例代码放在一起。除了布尔指示符外,唯一保留的是连接信号的handler_id。正如你可能已经注意到,它的编程Gtk3,但重要的方法handler_blockhandler_unblock功能完全相同的方式在两个GTK 2和3

from gi.repository import Gtk 

class TestWindow(Gtk.Window): 

    def __init__(self, *args, **kwargs): 
     Gtk.Window.__init__(self, *args, **kwargs) 
     self.connect("destroy", Gtk.main_quit) 
     self.is_allowed = True 
     self.create_widgets() 
     self.show_all() 

    def create_widgets(self): 
     box = Gtk.HBox() 
     self.entry = Gtk.Entry() 
     self.handler_id = self.entry.connect("changed", self.on_entry_changed) 
     box.pack_start(self.entry, True, True, 0) 
     button = Gtk.Button("Toggle") 
     button.connect("clicked", self.on_button_clicked) 
     box.pack_start(button, True, True, 0) 
     self.add(box) 

    def on_entry_changed(self, *args): 
     print "entry has changed" 

    def on_button_clicked(self, *args): 
     if self.is_allowed: 
      self.entry.handler_block(self.handler_id) 
      print "now blocking" 
     else: 
      self.entry.handler_unblock(self.handler_id) 
      print "now unblocking" 
     self.is_allowed = not self.is_allowed 

TestWindow() 
Gtk.main() 
+0

完美!它确实是我正在寻找的'widget.handler_block'和'widget.handler_unblock'。 – deinonychusaur