如何从模块中的函数引用基本实例python gtk小部件

时间:2012-04-19 21:58:29

标签: python inheritance gtk

我正在编写一个用于研究某种数学数据的Python GTK应用程序。主脚本只有一个类,只有三个方法:__INIT__,main(self)用于启动循环,delete_event用于终止循环。

__INIT__创建GUI,其中包括TextBuffer和TextView小部件,以便分析函数(在单独的functions.py模块上定义)可以将其结果输出到公共日志/消息区域。相关提取物如下:

include module functions(.py)

(...)

class TURING:

  def __init__(self):

    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

    (...)

    self.logscroll = gtk.ScrolledWindow()
    self.logscroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)

    self.logbuffer = gtk.TextBuffer()

    self.logpage = gtk.TextView(self.logbuffer)
    self.logpage.set_editable(gtk.FALSE)
    self.logpage.set_cursor_visible(gtk.FALSE)
    self.logpage.set_wrap_mode(gtk.WRAP_CHAR)
    self.logscroll.add(self.logpage)
    self.logscroll.show()
    self.logpage.show()

    (...)

    enditer = self.logbuffer.get_end_iter()
    self.logbuffer.insert(enditer, 'Welcome!')

    (...)

  def main(self):
    gtk.main()

if __name__ == "__main__":
  turing = TURING()
  turing.main()

中间两行成功地将欢迎消息打印到self.logpage定义的消息区域。

现在,方法函数中的一个函数检查数据库是否是最新的,如果没有,则要求用户加载一批新的原始数据。

这样做的一种方法是包含一个触发该功能的菜单项,如下所示:

item_dataCheck.connect(“activate”,functions.data_check,'')

functions.data_check运行正常但是当它尝试将其输出写入self.logbuffer时,会抛出一个错误,抱怨菜单项item_dataCheck没有属性logbuffer。违规代码是

 enditer = self.logbuffer.get_end_iter()
 self.logbuffer.insert(enditer, 'Please update the database.')

显然,self这个名称代表了调用该函数的小部件,即item_dataCheck。我的问题是如何从functions.data_check直接引用logbuffer作为turing类的TURING实例的成员。我试着写

 enditer = turing.logbuffer.get_end_iter()
 turing.logbuffer.insert(enditer, 'Please update the database.')

但这不起作用。我努力寻找解决方案,但没有成功。

我认为这件事非常简单,我知道我仍然有一些Python和OOP的严重概念问题,但任何帮助都会受到衷心的赞赏。 (我开始在Burroughs主机上冲击Fortran程序,所以我可以指望一些社区的怜悯......)

1 个答案:

答案 0 :(得分:1)

将信号连接到函数或方法时,可以提供其他参数。因此,除了functions.data_check

之外,您的处理程序self可以接受额外的参数
def data_check(self, logbuffer):
    # ...

然后,你可以connect with arguments

item_dataCheck.connect("activate", functions.data_check, logbuffer)

此外,self参数通常用作方法定义中的第一个参数。这是一个非常强大的约定,因此您应该使用obj或类似的东西。特别是因为您的信号处理程序也可能是方法;在这种情况下,你可以搞砸它的论点。