我正在编写一个用于研究某种数学数据的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程序,所以我可以指望一些社区的怜悯......)
答案 0 :(得分:1)
将信号连接到函数或方法时,可以提供其他参数。因此,除了functions.data_check
:
self
可以接受额外的参数
def data_check(self, logbuffer):
# ...
然后,你可以connect with arguments:
item_dataCheck.connect("activate", functions.data_check, logbuffer)
此外,self
参数通常用作方法定义中的第一个参数。这是一个非常强大的约定,因此您应该使用obj
或类似的东西。特别是因为您的信号处理程序也可能是方法;在这种情况下,你可以搞砸它的论点。