编写Python GTK +应用程序的"良好实践"方法是什么?

sen*_*sae 7 python pygtk

我目前正在编写一个PyGTK应用程序,我想就构建我的应用程序的最佳方法提出一些建议.基本上,应用程序将读取特定的文件规范并将其显示在GUI中以进行编辑.

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

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

将我的问题浓缩成一个短暂的问题:是否有办法以更加pythonic或OO友好的方式实现我的目标?

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

其他pythonic建议欢迎,这是我的第一个python程序,我可能会陷入更多的C++思维方式.我打算重构很多.

det*_*tly 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)
Run Code Online (Sandbox Code Playgroud)

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

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

app.show_all()

gtk.main()
Run Code Online (Sandbox Code Playgroud)

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

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

parser = parser.DummyParser(...)
Run Code Online (Sandbox Code Playgroud)