如何以“最佳实践”的方式编写Python GTK+应用程序?

7

我正在编写一个PyGTK应用程序,并希望得到一些关于如何最佳组织应用程序的建议。基本上,该应用程序将读取特定的文件规范并在GUI中呈现以供编辑。

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

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

简化我的问题:是否有更符合Pythonic或面向对象友好的方法来实现我的目标?

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

欢迎提出其他Pythonic建议,这是我的第一个Python程序,我可能陷入了更C++风格的思维中。我计划进行大量重构。

1个回答

5
你应该查看教程"在Python中子类化GObject"。这个教程介绍了如何使用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(...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接