0

我正在编写一个 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("激活", 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成员。我试着写turingTURING

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

但那是行不通的。我一直在努力寻找解决方案,但没有成功。

我相信这件事很简单,而且我知道我在 Python 和 OOP 方面仍然存在一些严重的概念问题,但我们将衷心感谢任何帮助。(我开始在 Burroughs 大型机上打卡 Fortran 程序,所以我可以指望一些社区的仁慈......)

4

1 回答 1

1

在将信号连接到函数或方法时,您可以提供额外的参数。所以你的处理程序functions.data_check可以接受额外的参数,除了self

def data_check(self, logbuffer):
    # ...

然后,您可以连接参数

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

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

于 2012-04-20T00:12:43.623 回答