3

我可能在我的 pygtk 编程中遗漏了一些基本的东西,但是我想将一个信号连接到例如 angtk.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-native 方式让小部件知道它不应该发送信号(当我单击示例中的按钮时)。我很确定我曾经偶然发现过这样做的方法,但我迷失了再次找到它。

此外,绝对清楚,仍然必须允许启用小部件。

4

1 回答 1

4

我认为没有办法绕过布尔标志。是否允许小部件发出信号是附加的应用程序逻辑,因此必须保存在某个地方。
根据您之前对该主题的研究和相当准确地描述的功能,您很可能正在寻找PyGTK 教程的第 20.1.2 章
我将综合示例代码放在一起。除了布尔指标外,唯一需要保留的是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()
于 2012-09-06T22:15:45.230 回答