Python 如何在GObject中使用自定义信号?

Python 如何在GObject中使用自定义信号?,python,gtk,pygobject,gobject,Python,Gtk,Pygobject,Gobject,我想用一个TreeView小部件和其中的一些项目制作一个程序,通过发射和捕获一个我称之为incr的信号来交换数据 我创建了10个树项目,将incr信号连接到每个项目。现在,如果我从其中一个发出incr信号,为什么其他9个不接收它 为什么只有发射器对象捕捉自身发出的信号 下面是演示此问题的示例程序: #/usr/bin/env蟒蛇3 从gi.repository导入Gtk,GObject 类树项(GObject.GObject): __G信号\uuuu={ “incr”:(GObject.SIGN

我想用一个TreeView小部件和其中的一些项目制作一个程序,通过发射和捕获一个我称之为
incr
的信号来交换数据

我创建了10个树项目,将
incr
信号连接到每个项目。现在,如果我从其中一个发出
incr
信号,为什么其他9个不接收它

为什么只有发射器对象捕捉自身发出的信号

下面是演示此问题的示例程序:

#/usr/bin/env蟒蛇3
从gi.repository导入Gtk,GObject
类树项(GObject.GObject):
__G信号\uuuu={
“incr”:(GObject.SIGNAL\u RUN\u LAST,GObject.TYPE\u NONE,())
}
定义初始(自我,标题):
GObject.GObject.\uuuu init\uuuuu(self)
self.title=标题
def do_增量(自身):
打印(“它工作!”)
GObject.type_寄存器(TreeItem)
班级申请(Gtk.窗口):
定义初始化(自):
超级()
self.connect('destroy',self.\u on\u destroy)
vbox=Gtk.vbox()
按钮=Gtk.按钮('发出信号')
按钮。连接('点击',自。\点击按钮)
vbox.pack_start(按钮、假、假、0)
list_store=Gtk.ListStore(GObject.GObject)
text_renderer=Gtk.cellrenderText()
tree_column=Gtk.TreeViewColumn(无,文本渲染器)
self.\u tree\u view=Gtk.TreeView(列表存储)
self.\树\视图.附加\列(树\列)
树\列。设置\单元格\数据\函数(文本\渲染器,自。\填充\树)
vbox.pack\u start(self.\u树视图,True,True,0)
self.add(vbox)
self.show_all()
对于范围(10)内的i:
项目=TreeItem(str(i))
项目连接('incr',self.\u on\u incr)
list_store.append((项,))
增量上的定义(自身,项目):
item.title=str(int(item.title)+1)
self.\uuuu树\u视图.队列\u绘图()
单击按钮上的定义(self,e):
selected_item=self.get_selected_item()
如果选择了以下项目:
所选项目。发射('incr')
def get_selected_项目(自身):
selection=self.\u树\u视图。获取\u selection()
如果选择:
型号,iter_u=selection.get_selected()
返回模型.get_值(iter_,0)
定义填充树(自身、列、单元、模型、iter、用户数据):
项目=模型。获取值(iter,0)
cell.set_属性('text',item.title)
def_uuon_udestroy(self,e):
Gtk.main_quit()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
应用程序()
Gtk.main()
我创建了10个树项目,将“incr”信号连接到每个项目,现在如果我从其中一个项目发出“incr”信号,为什么其余9个项目无法接收

您正在将TreeItems连接到应用程序,以便在TreeItem发出应用程序接收到的信号时如预期的那样。你的TreeItem没有连接到任何东西,因此它们没有收到任何东西。我不完全确定你想在什么地方实现你想要的行为

我创建了10个树项目,将“incr”信号连接到每个项目,现在如果我从其中一个项目发出“incr”信号,为什么其余9个项目无法接收


您正在将TreeItems连接到应用程序,以便在TreeItem发出应用程序接收到的信号时如预期的那样。你的TreeItem没有连接到任何东西,因此它们没有收到任何东西。我不完全确定您想要在什么地方实现这种行为。

相关部分如下:

[…]
对于范围(10)内的i:
项目=TreeItem(str(i))
项目连接('incr',self.\u on\u incr)
list_store.append((项,))
将每个项目连接到一个信号,然后:

def\u点击按钮(self,e):
selected_item=self.get_selected_item()
如果选择了以下项目:
所选项目。发射('incr')
它只向所选项目发射信号,因为该项目是唯一发射的项目


每个项都连接到同一个方法这一事实并不意味着当信号发出时,所有项都将被调用。每个对象都会发出信号,就像您在
所选项目中所做的那样。emit('incr')
(您告诉我们:对于此
所选项目
,请发出信号
incr
)。其他项目的信号从未发出。

相关部分如下:

[…]
对于范围(10)内的i:
项目=TreeItem(str(i))
项目连接('incr',self.\u on\u incr)
list_store.append((项,))
将每个项目连接到一个信号,然后:

def\u点击按钮(self,e):
selected_item=self.get_selected_item()
如果选择了以下项目:
所选项目。发射('incr')
它只向所选项目发射信号,因为该项目是唯一发射的项目


每个项都连接到同一个方法这一事实并不意味着当信号发出时,所有项都将被调用。每个对象都会发出信号,就像您在
所选项目中所做的那样。emit('incr')
(您告诉我们:对于此
所选项目
,请发出信号
incr
)。其他项目的信号从未发出。

在上述代码中的任何位置都不会发出信号。当你发出信号时,同一类型的其他物体不会收到通知;它们必须连接到其他物体的信号才能工作。值得一提的是,如果您希望GtkTreeView在每次调用
do_incr
信号时都进行更新,那么最好使用自定义的GtkTreeModel子类;它有一个
changed
信号,您可以发出该信号来通知GtkTreeView对象已更改。@我正在单击按钮()时发出信号。所有项都通过connect()连接到回调函数。在上述代码的任何地方都不会发出信号。当你发出信号时,