【问题标题】:What is a 'good practice' way to write a Python GTK+ application?编写 Python GTK+ 应用程序的“良好实践”方式是什么?
【发布时间】:2010-09-09 02:18:32
【问题描述】:

我目前正在编写一个 PyGTK 应用程序,我想要一些关于构建我的应用程序的最佳方式的建议。基本上,应用程序将读取特定文件规范并将其呈现在 GUI 中以供编辑。

目前我有一个 parser.py,它处理所有低级文件 IO 和文件解析。我在树视图中显示文件的内容,这意味着我需要使用树存储作为我的数据类型。

我遇到的问题是我只想到了两个解决方案。第一个是我的解析器可以构建一个树存储并将其传递给我的 ui 类。这需要我的解析器依赖于 pygtk,并最大限度地减少类的潜在重用。第二个是在解析器中存储对我的 ui 类的引用,这也可能会限制我的解析器类作为独立库的重用。

将我的问题浓缩为一个简短的语句:有没有办法以更 Python 或 OO 友好的方式实现我的目标?

如果查看我的代码可以帮助任何试图回答我的问题的人:https://code.launchpad.net/~blainepace/nbtparser/trunk

欢迎其他 pythonic 建议,这是我的第一个 python 程序,我可能会陷入更 C++ 的思维方式。我计划对其进行大量重构。

【问题讨论】:

    标签: python pygtk


    【解决方案1】:

    你应该看看教程"Sub-classing GObject in Python"。这通过使用 GObject 的类型系统来创建信号和属性,这允许您以易于与典型 PyGTK 语义(连接到信号、等待属性通知等)集成的方式对底层行为进行建模。

    您的解析器和 UI 都应该只有要连接的属性和信号。然后,您有第三个类连接这些信号和回调,并在 if __name__ == __main__ 块中启动主循环。

    通常,我的看起来像:

    class MyApp(gtk.Window):
    
        def __init__(self, parser, ui):
            gtk.Window.__init__(self)
            parser.connect("some-signal", ui.update_this)
            parser.connect("some-other-signal", ui.update_that, extra_params)
            ui.connect("refresh-clicked", parser.reparse_file)
            self.add(ui)
    

    ...然后在你的主脚本中:

    parser = parser.Parser(...)
    ui = view.ParseView(...)
    app = MyApp(parser, ui)
    
    app.show_all()
    
    gtk.main()
    

    当然,这通常取决于例如。我在使用 Glade 吗?我是为主应用程序的子类小部件还是包装它们?等等

    这样做的好处是,您可以编写一个测试解析器,该解析器除了返回预编程的响应之外什么都不做,或者使用已知的测试文件。换上它就像更改上面的一行一样简单:

    parser = parser.DummyParser(...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      相关资源
      最近更新 更多