手动切换小部件在pygtk中发出信号的能力

时间:2012-09-06 20:11:31

标签: python pygtk

我可能在我的pygtk编程中遗漏了一些基本内容,但我想将信号连接到例如一个gtk.Entry,然后让它只在我允许的情况下发出连接的信号。

也就是说,我想在这个最小代码中添加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本地方式让小部件知道它不应该发送信号(当我点击示例中的按钮时)。我很确定我偶然发现了这样做的一种方式,但是我又迷失了它。

另外,要绝对清楚,仍然必须启用小部件。

1 个答案:

答案 0 :(得分: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()