用于部署Python应用程序的跨平台gui工具包

时间:2009-02-06 11:43:30

标签: python user-interface cross-platform

建立在: http://www.reddit.com/r/Python/comments/7v5ra/whats_your_favorite_gui_toolkit_and_why/

优点:

1 - 易于设计/整合 - 学习曲线

2 - 支持/可用于* nix,Windows,Mac,本机l& f的额外积分,支持移动或网络

3 - pythonic API

4 - 文档质量 - 我想做一些更复杂的事情,现在是什么?

5 - 轻量级打包所以没有必要包含一个完整的安装程序(py2exe,理想情况下py2app可以按原样工作,而不会生成大量的MB文件)

6 - 许可

7 - 其他人? (指定)


竞争者:

1 - tkinter,目前支持(截至2.6,3.0)

2 - pyttk库

3 - pyGTK

4 - pyQt

5 - wxPython

6 - 通过基于Python的框架(Django,Turbogears,web.py,Pylons ......)或粘贴

的HTML-CGI 7 - 其他人? (指定)

5 个答案:

答案 0 :(得分:44)

请不要犹豫,扩大这个答案。

Tkinter

Tkinter是python附带的工具包。这意味着您已拥有编写GUI所需的一切。这也意味着如果你选择分发你的程序,很可能其他人已经拥有了运行程序所需的东西。

Tkinter成熟且稳定,并且(至少可以说)非常容易使用。我发现它比wxPython更容易使用,但显然这有点主观。

Tkinter因为看起来丑陋和过时而得到了糟糕的说唱。虽然使用Tkinter创建丑陋的GUI很容易,但创建漂亮的GUI也很容易。 Tkinter不会牵着你的手,但它也不会妨碍你。 Tkinter在Mac和Windows上看起来最好,因为它在那里使用本机小部件,但它在linux上看起来也不错。

关于Tkinter外观的另一点是,在大多数情况下,外观并不像人们想象的那么重要。使用工具包(如Tkinter,wxPython,PyQT等)编写的大多数应用程序都是专用应用程序。对于这些工具包的应用类型,可用性胜过看起来。如果应用程序的外观很重要,那么很容易完善Tkinter应用程序。

Tkinter具有其他工具包无法匹配的一些功能。变量跟踪,命名字体,几何(布局)管理器以及Tkinter处理事件的方式仍然是应该判断其他工具包的标准。

在缺点方面,Tkinter是一个在python中运行的Tcl解释器的包装器。对于使用Tkinter开发的人来说,这几乎是不可见的,但有时会导致暴露此体系结构的错误消息。你会得到一个错误,抱怨一个名为“.1245485.67345”的小部件,除非你也熟悉Tcl / tk的工作方式,否则对任何人都没有意义。

另一个缺点是Tkinter没有像wxPython那样多的预构建小部件。例如,Tkinter中的分层树小部件有点弱,并且没有内置的表小部件。另一方面,Tkinter的画布和文本小部件非常强大且易于使用。对于大多数类型的应用程序,您将编写,但是,您将拥有所需的一切。只是不要指望用Tkinter复制Microsoft Word或Photoshop。

我不知道Tkinter的许可证是什么,我假设与整个python相同。 Tcl / tk具有BSD风格的许可证。

PyQt

它构建于Qt之上,是一个C ++框架。它非常先进,并且有一些很好的工具,比如Qt Designer来设计你的应用程序。你应该知道,它不像Python 100%,但接近它。 documentation非常好

这个框架非常好。它由诺基亚旗下的奇趣科技积极开发。 Python的绑定由Riverbank开发。

PyQt根据GPL许可证或商业许可证提供。河岸PyQt许可证的价格约为每个开发商400欧元。

Qt不仅是一个GUI框架,而且还有很多其他类,只需使用Qt类就可以创建一个应用程序。 (像SQL,网络,脚本,......)

Qt用于在每个平台上模拟GUI元素,但现在使用平台的原生样式(尽管不是原生GUI工具包):请参阅the documentation for Mac OS Xthe windows XP style

打包就像运行py2exe或pyInstaller一样简单。我的PyQt应用程序的内容在Windows上看起来像这样(我在其上面使用InnoSetup进行正确安装):

pyticroque.exe           PyQt4.QtGui.pyd           unicodedata.pyd
MSVCP71.dll              PyQt4._qt.pyd             unins000.dat
MSVCR71.dll              python25.dll              unins000.exe
PyQt4.QtCore.pyd         sip.pyd                   _socket.pyd

QT附带了一个小部件设计师,甚至在最新版本中都有IDE来帮助设计Qt软件。

PySide

PySide是与Qt绑定的LGPL。它由诺基亚开发,作为GPL PyQt的替代品。

  

虽然基于不同   技术比现有技术   GPL许可的PyQt绑定,PySide   最初的目标是   API兼容它们。此外   与PyQt兼容的API,更多   Pythonic API将在   将来

wxPython

wxPython是使用wxWidgets - Framework的Python绑定。该框架受LGPL许可,由开源社区开发。

我真正缺少的是设计界面的好工具,它们大约有3个,但没有一个可用。

我应该提到的一点是,我在标签视图中发现了一个错误,尽管事实上我没有使用任何先进的东西。 (仅限Mac OS X)我认为wxWidgets不如Qt那么精致。

wxPython实际上只关于GUI类,没有太多其他内容。

wxWidgets使用本机GUI元素。

wxPython优于Tkinter的一个优点是wxPython有一个更大的小部件库可供选择。

其他

我没有任何其他GUI框架的经验,也许是其他人的。

答案 1 :(得分:6)

Jython

  

Jython是一个实现   高层次,动态,面向对象   语言Python以100%Pure编写   Java,与之无缝集成   Java平台。因此它允许你   在任何Java平台上运行Python。

您可以使用Swing,Applet或Java平台可用的其他GUI框架。有关Java TutorialsGraphical User Interfaces的信息,请参见2D Graphics。有很多书和documentation,例如API reference

这是来自An Introduction to Jython的Hello world Swing应用程序。

from javax.swing import *

frame = JFrame("Hello Jython")
label = JLabel("Hello Jython!", JLabel.CENTER)
frame.add(label)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(300, 300)
frame.show()

这是一个Jython applet by Todd Ditchendorf that demonstrates multi-threaded particle drawing(60行)。

from __future__ import nested_scopes
import java.lang as lang
import java.util as util
import java.awt as awt
import javax.swing as swing

class Particle:

    def __init__(self,initX,initY):
    self.x = initX
    self.y = initY
    self.rng = util.Random()

    def move(self):
    self.x += self.rng.nextInt(10) - 5
    self.y += self.rng.nextInt(20) - 10

    def draw(self,g2):
    g2.drawRect(self.x,self.y,10,10)

class ParticleCanvas(awt.Canvas):

    def __init__(self,newSize):
    awt.Canvas.__init__(self,size=(newSize,newSize))

    def paint(self,g2):
    for p in self.particles:
        p.draw(g2)

class ParticleApplet(swing.JApplet):

    def init(self):
    self.canvas = ParticleCanvas(self.getWidth())
    self.contentPane.add(self.canvas)

    def start(self):
    n = 10
    particles = []
    for i in range(n):
        particles.append(Particle(150,150))
    self.canvas.particles = particles

    self.threads = []
    for i in range(n):
        self.threads.append(self.makeThread(particles[i]))
        self.threads[i].start()

    def makeThread(self,p):

    class MyRunnable(lang.Runnable):
        def run(this):
        try:
            while 1:
            p.move()
            self.canvas.repaint()
            lang.Thread.sleep(100)
        except lang.InterruptedException:
            return

    return lang.Thread(MyRunnable())

如果你只想绘制线条和圆圈,你可以把它缩小到一半。

答案 2 :(得分:6)

我只是在说TKinter很糟糕。遗憾的是,由于向后兼容性,它被Python打包。

文档太可怕了。看起来很可怕。我遇到了一些奇怪的错误,实际上会让Python崩溃。

答案 3 :(得分:5)

如果有人知道比通常讨论的更好的东西,我绝对会感激不尽;我觉得头痛找到合适的东西......

Qt很棒,但PyQt似乎没有相同的开发资源。它似乎有一些聪明的方法来生成绑定,但是不完整(例如PyKDE终端kpart)并且缺乏文档(正如开发人员所承认的那样)。与Qt的UI设计器的兼容性很好。

wxpython - 控件看起来不太好看,小部件库没有KDE那么大。

OpenGL - 默认情况下甚至不支持字体... pygame没关系,但是opengl是一个状态机太烦人了(面向对象的模型阻止了调用处于错误的状态)。

XUL - 整洁的想法,我希望它有效。 pyxulrunner教程对我不起作用 - 首先我必须将xulrunner / usr / lib路径添加到LD_LIBRARY_PATH,然后它仍然存在“来自xpcom导入组件”的问题......

我的ui图书馆愿望清单

  • Python集成(即使用像unicode这样的内置函数,像线程一样的模块,以及像闭包这样的语言功能)
  • 良好的中间表示(如XUL而不是生成数百行看起来像“listbox91.addChild(label28)”)
  • 简单的 mutlithreaded支持(自动锁定或事件发布,例如elt.setText可以从任何线程调用;让设计者在必要时使用Python锁来管理锁定)
  • 以用户为中心的功能 - 一系列UI事件的脚本编写,键绑定任何内容的能力(KDE具有dcop,但afaik绑定不是由UI库自动完成的),以及拦截事件。
  • 大型,易于贡献的标准库的潜力。
  • 文档,但如果图书馆设计得很好并且产生了足够的兴趣,这将是一个给定的。

根据我的经验,html比UI库更容易获得好看的东西。

编辑 - 在使用PyQt 4一段时间后,它可以完成简单UI的工作。我目前没有为最终用户开发,所以看起来并不重要。 QTextBrowser对于显示基本HTML表和生成HTML链接非常有用。

答案 4 :(得分:0)

Pro wxPython

  • 很多教程
  • wxGlade作为编辑:还不完美,但可以使用。