当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《用于部署Python应用程序的跨平台gui工具包》经验,为你挑选了4个好方法。

建立在: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将按原样工作,不会产生大量MBs文件)

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 - 其他人?(请注明)



1> Georg Schöll..:

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

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%,但接近它.该文档是优秀的

这个框架非常好.它由诺基亚旗下的奇趣科技积极开发.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绑定不同的技术,但最初的目标是与它们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框架的经验,也许其他人有.



2> Unknown..:

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

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


FWIW,我已经让wxPython崩溃了,比tkinter更重要.我想这一切都取决于你如何使用它,什么版本,以及什么平台.

3> Eugene Yokot..:

Jython.

Jython是用100%纯Java编写的高级动态面向对象语言Python的实现,并与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())

如果你只想绘制线条和圆圈,你可以把它减少一半.



4> gatoatigrado..:

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

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链接非常有用.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有