我可能在我的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本地方式让小部件知道它不应该发送信号(当我点击示例中的按钮时)。我很确定我偶然发现了这样做的一种方式,但是我又迷失了它。
另外,要绝对清楚,仍然必须启用小部件。
答案 0 :(得分:3)
我认为布尔标志周围没有办法解决问题。允许小部件发出信号是否是附加应用逻辑,因此必须保留在某处
根据您之前对该主题的研究以及非常精确描述的功能,您最有可能寻找chapter 20.1.2 of the PyGTK tutorial。
我把综合示例代码放在一起。除了布尔指示符之外,唯一要保留的是连接信号的handler_id
。您可能已经注意到,它已在Gtk3中编程,但重要的方法handler_block
和handler_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()