pygtk,回调方法和控制器

时间:2012-06-28 12:24:34

标签: python model-view-controller user-interface callback pygtk

pygtk中有一些我不理解的东西:

我尝试构建一个gui来与slqlite数据库进行交互    为了操纵几个服务器上的一些远程网络配置。

所以我制作了三个文件:

Mygui.py包含所有pygtk指令;    Mydata.py包含所有sqlite操作    最后Myapp.py应该进行Mygui和sqlite之间的互动。

但我不知道如何实现回调功能及其定义:

在Myapp.py中使用这些行:

 class Myapp():
   def __init__():
      self.data = Mydata()
      self.gui = Mygui()

...

并在Mygui.py中使用这些行:

 class Mygui():
   def __init__():

...            self.Base_menu = gtk.Menu()            self.contenu_item = gtk.MenuItem('contenu base“)            self.Base_menu.append(self.contenu_item) ......#others

       self.contenu_item("activate", contenu_callback )

我认为(可能是假的)“contenu_callback” 应该在Myapp.py中它将数据库与显示器连接起来 但我不明白怎么做?


(edit after 5 minutes )

感谢您的回答,但我不确定我是否理解正确: 所以我从你的最后一行中理解的是,在模块“MyGui.py”中, 我应该添加"import Myapp.py()"才能打电话 "Myapp.activate_callback" ( "other.module" in this case being Myapp )

所以全局我将拥有“Myapp.py”,它包含“import Mydata”和“import Mygui”以及模块“Mygui.py”,它将包含“import pygtk”和“import Myapp”。

我对“Myapp.py”与“MyGui”之间的循环关系感到不满意 和“MyGui”将导入“Myapp”

这是否真的应该将gui程序与应用程序处理分开?

2 个答案:

答案 0 :(得分:0)

回调可以是任何可调用的,因此, 你放置它们取决于你。

def activate_callback(widget, data=None):
    pass 
some_widget.connect("activate", activate_callback)


class SomeClass(object):
    def activate_callback(widget, data=None):
        pass
my_class = SomeClass()
some_widget.connect("activate", my_class.activate_callback)


import some.other.module
some_widget.connect("activate", some.other.module.activate_callback)

答案 1 :(得分:0)

这取决于你想要分离的严格程度。如果你更喜欢它有点松散,你可以将myapp传递给Mygui实例,然后Mygui可以在Myapp上调用方法:

class Myapp():
   def __init__():
      self.data = Mydata()
      self.gui = Mygui(self)

或者你可以在Mygui上定义一堆事件,并为这些事件安装Myapp注册处理程序:

class Myapp():
   def __init__():
      self.data = Mydata()
      self.gui = Mygui()
      self.gui.connect("record-saved", self.record_saved_handler)

后者更加脱钩但涉及更多仪式。