跨平台GUI工具包用于部署Python应用程序。

50

基础来源: http://www.reddit.com/r/Python/comments/7v5ra/whats_your_favorite_gui_toolkit_and_why/

优点:

1 - 易于设计/集成-学习曲线低

2 - 支持/可用于*nix、Windows、Mac,本地外观加分,支持移动或网络

3 - Python API

4 - 文件质量好——我想做一些更复杂的事情,现在怎么办?

5 - 轻量级打包,因此不必包含完整的安装程序(py2exe、py2app最好可以直接使用而不是生成几百 MB 的文件)

6 - 授权许可证

7 - 其他?(具体说明)


竞争者:

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

2 - pyttk 库

3 - pyGTK

4 - pyQt

5 - wxPython

6 - 基于 Python 框架的 HTML-CGI(Django、Turbogears、web.py、Pylons……)或 Paste

7 - 其他?(具体说明)


1
HTML-CGI 作为 GUI 工具包?什么鬼? - ddaa
1
作为替代品,它还可以直接进行远程控制。请参见http://deluge-torrent.org/screenshots.php。你说得没错,但问题必须适合一行... - nachik
1
是的,您可以将一个 Web 服务器(Python 已经在标准库中提供了)集成到您的应用程序中,并使用浏览器作为 GUI。一些应用程序就是这样做的。 - Eli Bendersky
1
那么你选择了哪一个? - iamgopal
5个回答

51
请不要犹豫,扩展此答案。

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-style许可证。 PyQt 它是基于C++框架Qt构建的。它非常先进,并具有一些很好的工具,如Qt Designer,可用于设计应用程序。但是,您应该知道,它并不感觉完全像Python,但接近。 documentation非常出色。
这个框架非常好。它由Nokia拥有的Trolltech积极开发。Python的绑定是由Riverbank开发的。

PyQt可在GPL许可证或商业许可证下使用。一份河岸PyQt许可证的价格约为每个开发人员400欧元。

Qt不仅是一个GUI框架,还有很多其他类,可以只使用Qt类创建应用程序。(例如SQL,网络,脚本等)

Qt曾经在每个平台上模拟GUI元素,但现在使用平台的原生样式(尽管不是原生GUI工具包):请参阅Mac OS X的文档Windows XP风格

打包只需运行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的替代品。

尽管 PySide 基于不同的技术,而非现有的 GPL 许可的 PyQt 绑定,但 PySide 最初的目标是与其兼容。除了 PyQt 兼容的 API 之外,未来还将提供更具 Python 风格的 API。

wxPython

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

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

我应该提到的一件事是,尽管我没有使用任何高级功能,但我在选项卡视图中发现了一个错误。(仅在 Mac OS X 上) 我认为 wxWidgets 不如 Qt 精细。

wxPython 真正关注的只是 GUI 类,其他内容很少。

wxWidgets 使用本地 GUI 元素。

wxPython 相对于 Tkinter 的优势在于,它拥有更多的小部件库供选择。

其他

我没有使用其他 GUI 框架的经验,也许其他人有。


Qt 模拟本地的 Windows 小部件,我还没有看到过一个不够本地的,因此在所有实际目的上它们就是本地的。 - Eli Bendersky
远非易于使用,而且当与这些工具一起使用时,wxWidgets 不会使用系统相关的边距。 - Georg Schölly
PyGame怎么样?它适合加入这个列表吗? - Iulius Curt
只是出于好奇,http://sourceforge.net/projects/wxformbuilder/有什么问题吗? - Ajasja
Tkinter在Mac和Windows上显示效果最佳,因为它使用本地窗口小部件。但是在Windows上显示效果较差,因为它不能匹配系统主题。参考链接:https://dev59.com/5XI-5IYBdhLWcg3w3cnS#1635043 - endolith
显示剩余2条评论

7

我想说的是,TKinter很糟糕。不幸的是,由于向后兼容性,它似乎被Python捆绑在一起。

文档非常差劲,看起来也很糟糕。我遇到了一些奇怪的错误,这些错误实际上会导致Python崩溃。


5
就我个人经验而言,wxPython 比 tkinter 崩溃的频率高了好几个数量级。我猜这取决于你如何使用它,使用的版本以及所在的平台。 - Bryan Oakley

6

Jython.

Jython 是高级、动态、面向对象语言 Python 的一种实现,用 100% 纯 Java 编写,并与 Java 平台无缝集成。因此,它允许您在任何 Java 平台上运行 Python。

您可以使用 Swing、Applet 或其他可用于 Java 平台的 GUI 框架。请参阅Java 教程了解图形用户界面2D 图形。还有大量书籍和文档,例如API 参考资料

下面是来自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()

这是一份由Todd Ditchendorf编写的Jython 小程序,演示了多线程粒子绘制(共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())

如果您只对绘制线条和圆形感兴趣,那么您可能可以将其减少一半。

你推荐使用哪个Java GUI库?它有多大 - 例如用于带有绘制矩形/线条/文本的画布的文档页数和代码行数是多少?谢谢。 - denis
1
一个注意点是,Jython 无法与需要 C 接口的 Python 模块一起使用。 - burkestar

5

如果有比常规讨论更好的东西,我一定会非常感激;我看起来很难找到合适的东西...

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

wxpython-控件不太好看,小部件库不如KDE大。

OpenGL-默认情况下甚至不支持字体... pygame还可以,但是opengl作为状态机太烦人了(面向对象模型防止在错误的状态下进行调用)。

XUL-好主意,但我希望它能工作。然而,pyxulrunner教程对我没用--首先我必须将xulrunner /usr/lib路径添加到LD_LIBRARY_PATH,然后它仍然有“from xpcom import components”的问题...

我对UI库的愿望清单:

  • Python集成(例如使用内置函数如unicode,模块如threading以及闭包等语言特性)
  • 良好的中间表示(例如使用XUL代替生成数百行类似于“listbox91.addChild(label28)” 的代码)
  • 简单的多线程支持(自动锁定或事件发布,以便可以从任何线程调用elt.setText;如果需要,让设计者使用Python锁来管理锁定)
  • 用户为中心的功能 - 脚本化UI事件序列,能够绑定任何内容(KDE有dcop,但我认为UI库并没有自动完成绑定),以及拦截事件。
  • 具有潜力的大型易于贡献的标准库。
  • 文档,虽然如果库被设计得很好并且引起足够的兴趣,这将是一个必须的条件。

根据我的经验,与UI库相比,html更容易实现好看的界面。

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


我不理解你对PyQt的抱怨。确实只有一个人在开发,但这项工作相当简单:将C++ Qt DLL映射到Python中,并由自动工具sip执行。那个人的工作只是维护sip,他在过去的9年里一直做得非常好。然后你抱怨PyKDE,但这是离题了,问题是关于Qt的。 - Philippe F
我知道;我不想攻击他。正如我在底部的编辑中所说,Qt对我来说已经完成了工作。我只是试图评估整个GUI工具包,而不管项目旨在做什么(或者是Qt的问题还是PyQt的问题)。这个问题涉及任何GUI工具包,许多引人注目的功能,例如终端集成等,都是随KDE一起提供的小部件(而PyKDE并不完整)。此外,代码生成阶段不像其他选项那样灵活;例如,要加载一个不在GUI相同目录中的常见resources.rc文件,必须修改sys.path。 - gatoatigrado

0

专业wxPython

  • 大量教程
  • wxGlade作为编辑器:尚不完美,但可用。

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