Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在pygtk中手动切换小部件发出信号的能力_Python_Pygtk - Fatal编程技术网

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

Python 在pygtk中手动切换小部件发出信号的能力,python,pygtk,Python,Pygtk,我可能缺少pygtk编程中的一些基本功能,但我希望将信号连接到例如gtk.Entry上,然后使其仅在我允许时发出连接的信号 也就是说,我想在这个最小代码(仅用于交互使用)中添加一些内容到切换_信令,以便只有在“允许”信令时才打印Hello: 我以前在自定义小部件类中为这种发送信号状态设置了布尔标志,例如,self.\u更新,并让回调函数在执行任何操作之前检查此状态。那不是我想要的 我想要一种gtk原生方式,让小部件知道它不应该发送信号(当我单击示例中的按钮时)。我很确定我曾经偶然发现了一种方法,

我可能缺少pygtk编程中的一些基本功能,但我希望将信号连接到例如
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()