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

2024-05-29 06:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

优点:

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

2-支持/提供*nix、Windows、Mac、本地l&f的额外点数、支持移动或web

3-PythonAPI

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

5-轻量级打包,因此不必包含完整的安装程序(py2exe,py2app理想情况下可以按原样工作,不会生成大量MBs文件)

6-许可

7-其他人?(具体说明)


竞争者:

1-tkinter,当前支持(从2.6到3.0)

2-pyttk库

3-派克

4-pyQt

5个月

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

7-其他人?(具体说明)


Tags: andcomwebhttpyourwwwguicomments
3条回答

我只是想说TKinter很烂。遗憾的是,由于向后兼容,它似乎是用Python打包的。

文件很糟糕。看起来很可怕。我遇到了一些奇怪的bug,它们会导致Python崩溃。

Jython

Jython is an implementation of the high-level, dynamic, object-oriented language Python written in 100% Pure Java, and seamlessly integrated with the Java platform. It thus allows you to run Python on any Java platform.

您可以使用Swing、Applet或Java平台可用的其他GUI框架。有关Graphical User Interfaces2D Graphics的信息,请参见Java Tutorials。有很多书和documentationAPI reference

这是来自An Introduction to Jython的helloworld 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()

这是Jythonapplet 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())

如果你只是对画线和圆感兴趣,你可以把它减半。

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

Tkinter

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

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

Tkinter因为长得丑而落伍而受到非议。虽然用Tkinter很容易创建难看的图形用户界面,但创建好看的图形用户界面也很容易。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设计器这样的好工具来设计您的应用程序。不过,你应该意识到,它不像Python 100%的感觉,而是接近它。这个documentation很好

这个框架真的很好。诺基亚旗下的Trolltech正在积极开发这款手机。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的替代品。

Although based on a different technology than the existing GPL-licensed PyQt bindings, PySide will initially aim to be API-compatible with them. In addition to the PyQt-compatible API, a more Pythonic API will be provided in the future.

wxPython

wxPython是使用wxWidgets-框架的Python绑定。这个框架在LGPL lic下是由开源社区开发的。

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

我应该提到的一件事是,我在tab视图中发现了一个bug,尽管我没有使用任何高级的工具。(仅在MacOSX上)我认为wxWidgets没有Qt那么完美。

wxPython实际上只是关于GUI类,没有太多其他的东西。

wxWidgets使用本机GUI元素。

wxPython比Tkinter的一个优势是wxPython有一个更大的小部件库,可以从中进行选择。

其他

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

相关问题 更多 >

    热门问题