代码之家  ›  专栏  ›  技术社区  ›  nachik

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

  •  46
  • nachik  · 技术社区  · 15 年前

    基于: http://www.reddit.com/r/Python/comments/7v5ra/whats_your_favorite_gui_toolkit_and_why/

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

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

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

    6-许可

    7-其他人((指定)


    1-tkinter,如当前支持的(从2.6、3.0开始)

    3-皮格特克

    4-pyQt

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

    7-其他人((指定)

    5 回复  |  直到 4 年前
        1
  •  48
  •   Georg Schölly    12 年前

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

    Tkinter

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

    特金特因长相丑陋和过时而受到不好的批评。虽然使用Tkinter很容易创建丑陋的gui,但是创建漂亮的gui也很容易。特金特没有握着你的手,但也不会妨碍你。Tkinter在Mac和Windows上看起来最好,因为它使用了本地小部件,但在linux上看起来也不错。

    关于Tkinter外表的另一点是,在大多数情况下,外表并不像人们想象的那么重要。使用Tkinter、wxPython、PyQT等工具箱编写的大多数应用程序都是专用应用程序。对于这些工具箱用于的应用程序类型,可用性胜过外观。如果应用程序的外观很重要,那么就很容易对Tkinter应用程序进行润色。

    Tkinter有一些其他工具包无法比拟的特性。变量跟踪、命名字体、几何(布局)管理器以及Tkinter处理事件的方式仍然是判断其他工具箱的标准。

    另一方面,Tkinter是运行在python中的Tcl解释器的包装器。这对于使用Tkinter开发的任何人来说都是不可见的,但有时会导致错误消息,从而暴露此体系结构。如果您不熟悉Tcl/tk的工作原理,那么您会遇到一个错误,抱怨一个名为“.1245485.67345”的小部件,这对任何人来说都毫无意义。

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

    PyQt

    它是建立在 Qt 一个C++框架。它非常先进,有一些很好的工具,比如Qt设计器来设计应用程序。不过,您应该意识到,它并不像Python那样100%,而是非常接近它。这个 documentation

    Qt不仅是一个GUI框架,而且还有很多其他类,人们可以通过使用Qt类来创建一个应用程序(例如SQL、网络、脚本等)

    Qt曾经在每个平台上模拟GUI元素,但现在使用平台的本机样式(尽管不是本机GUI工具箱):请参阅 the documentation for Mac OS X the 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

    比现有技术 GPL许可的PyQt绑定,PySide 最初的目标是 Pythonic API将在

    wxPython

    wxPython是使用 wxWidgets

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

    我应该提到的一点是,尽管我没有使用任何高级工具,但我还是在选项卡视图中发现了一个bug(只有在Mac OS X上)我想 不是那么光鲜 夸脱 .

    wxPython实际上只涉及GUI类,其他的就不多了。

    wxWidgets使用本机GUI元素。

    与Tkinter相比,wxPython的一个优势是wxPython有一个更大的小部件库可供选择。

    其他

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

        2
  •  7
  •   Unknown    15 年前

    我只是想说TKinter很烂。遗憾的是,由于向后兼容,它似乎挤满了Python。

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

        3
  •  6
  •   Eugene Yokota    13 年前

    Jython .

    Jython是 高级、动态、面向对象 Java,并与 Java平台。因此它允许你

    您可以使用Swing、Applet或Java平台可用的其他GUI框架。看到了吗 Java Tutorials 对于 Graphical User Interfaces 2D Graphics documentation API reference .

    An Introduction to Jython .

    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

    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
  •  5
  •   gatoatigrado    15 年前

    控件没有KDE好看,小部件库没有KDE大。

    pyxulrunner 不过,教程对我不起作用——首先我必须将xulrunner/usr/lib路径添加到LD\u LIBRARY\u路径,然后它仍然存在“从xpcom导入组件”的问题。。。

    我对ui库的愿望是

    • 良好的中间表示(如XUL,而不是生成数百行类似“listbox91.addChild(label28)”的行)
    • 简单的 多线程支持(自动锁定或事件发布,因此可以从任何线程调用elt.setText;如果需要,让设计器使用Python锁管理锁定)
    • 以用户为中心的特性还有:编写一系列UI事件的脚本、对任何内容进行键绑定的能力(KDE有dcop,但afaik绑定不是由UI库自动完成的),以及拦截事件。
    • 一个大的,易于贡献的标准库的潜力。
    • 文档,但是如果库设计得很好并且引起了足够的兴趣,这将是一个给定的问题。

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

    编辑

        5
  •  0
  •   Danny    15 年前

    专业wxPython

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