Python 在pygtk中手动切换小部件发出信号的能力
我可能缺少pygtk编程中的一些基本功能,但我希望将信号连接到例如Python 在pygtk中手动切换小部件发出信号的能力,python,pygtk,Python,Pygtk,我可能缺少pygtk编程中的一些基本功能,但我希望将信号连接到例如gtk.Entry上,然后使其仅在我允许时发出连接的信号 也就是说,我想在这个最小代码(仅用于交互使用)中添加一些内容到切换_信令,以便只有在“允许”信令时才打印Hello: 我以前在自定义小部件类中为这种发送信号状态设置了布尔标志,例如,self.\u更新,并让回调函数在执行任何操作之前检查此状态。那不是我想要的 我想要一种gtk原生方式,让小部件知道它不应该发送信号(当我单击示例中的按钮时)。我很确定我曾经偶然发现了一种方法,
gtk.Entry
上,然后使其仅在我允许时发出连接的信号
也就是说,我想在这个最小代码(仅用于交互使用)中添加一些内容到切换_信令
,以便只有在“允许”信令时才打印Hello
:
我以前在自定义小部件类中为这种发送信号状态设置了布尔标志,例如,self.\u更新
,并让回调函数在执行任何操作之前检查此状态。那不是我想要的
我想要一种gtk原生方式,让小部件知道它不应该发送信号(当我单击示例中的按钮时)。我很确定我曾经偶然发现了一种方法,但是我又一次找不到了
另外,为了绝对清楚,小部件仍然必须允许启用。我认为没有办法绕过布尔标志。小部件是否允许发出信号是附加的应用程序逻辑,因此必须保存在某个地方。
基于您之前对该主题的研究,以及您最可能寻找的非常准确的功能。
我把全面的示例代码放在一起。除了布尔指示符之外,唯一需要保留的是连接信号的
handler\u id
。正如您可能注意到的,它是在Gtk3中编程的,但是重要的方法handler\u block
和handler\u unblock
在GTK2和Gtk3中的功能完全相同
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()
完美的它确实是我正在搜索的
widget.handler\u block
和widget.handler\u unblock
。
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()