用于部署Python应用程序的跨平台gui工具包
build立在: http : //www.reddit.com/r/Python/comments/7v5ra/whats_your_favorite_gui_toolkit_and_why/
优点:
1 – 易于devise/整合 – 学习曲线
2 – * nix,Windows,Mac支持/可用性,原生l&f的额外点数,支持移动或网页
3 – pythonic API
4 – 质量文件 – 我想做一些更复杂的事情,现在呢?
5 – 轻量级包装,所以没有必要包括一个完整的安装程序(py2exe,py2app将理想的工作原样,不会产生gazillion MB文件)
6 – 许可
7 – 其他人? (请注明)
竞争者:
1 – tkinter,目前支持(截至2.6,3.0)
2 – pyttk库
3 – pyGTK
4 – pyQt
5 – wxPython
6 – HTML-CGI通过基于Python的框架(Django,Turbogears,web.py,Pylons …)或粘贴
7 – 其他人? (请注明)
请不要犹豫,扩大这个答案。
Tkinter的
Tkinter是python自带的工具包。 这意味着你已经拥有了编写GUI所需的一切。 这也意味着,如果你select分发你的程序,很可能其他人已经拥有了他们运行程序所需的东西。
Tkinter是成熟和稳定的,并且(至less可以说是)非常容易使用。我发现比wxPython更容易使用,但显然这是有点主观的。
因为看起来丑陋而过时,Tkinter得到了一个不好的说唱。 虽然Tkinter很容易创build丑陋的graphics用户界面,但创build漂亮的graphics用户界面也很容易。 Tkinter没有握住你的手,但是也没有太大的阻碍。 Tkinter在Mac和Windows上看起来最好,因为它在那里使用了原生的小部件,但是它在linux上看起来也不错。
关于Tkinter的另外一点是,大多数情况下,外观并不像人们想象的那么重要。 大多数使用Tkinter,wxPython,PyQT等工具包编写的应用程序都是特殊用途的应用程序。 对于这些工具包所使用的应用types,可用性胜过外观。 如果应用程序的外观很重要,那么很容易抛光一个Tkinter应用程序。
Tkinter有一些function,其他工具包不接近匹配。 variables轨迹,命名字体,几何(布局)pipe理器以及Tkinter处理事件的方式仍然是其他工具包应该被判断的标准。
另一方面,Tkinter是一个在python中运行的Tcl解释器的封装。 对于任何使用Tkinter开发的人来说,这大部分是看不见的,但是有时候会导致错误信息暴露出这个架构。 你会得到一个错误,抱怨一个像“.1245485.67345”这样的名字的小部件,除非你熟悉Tcl / tk的工作原理,否则这对任何人来说都是没有意义的。
另一个缺点是Tkinter没有像wxPython那样的预构件。 例如,Tkinter中的层级树构件有点弱,而且没有内置的表构件。 另一方面,Tkinter的canvas和文本小部件function非常强大,易于使用。 但是,对于大多数应用程序types,您将拥有所需的一切。 只是不要指望用Tkinter复制Microsoft Word或Photoshop。
我不知道Tkinter的授权是什么,我假设它和python是一样的。 Tcl / tk有一个BSD风格的许可证。
PyQt的
它build立在Qt之上,一个C ++框架。 这是相当先进的,并有一些像Qt Designer一样的好工具来devise你的应用程序。 你应该知道,虽然它不像Python 100%,但接近它。 文档非常好
这个框架非常好。 诺基亚所拥有的奇趣科技正在积极开发它。 Python的绑定是由Riverbank开发的。
PyQt是根据GPL许可证或商业版本。 每个开发商的PyQt许可证价格约为400欧元。
Qt不仅是一个GUI框架,而且还有很多其他类,只需使用Qt类就可以创build一个应用程序。 (像SQL,networking,脚本,…)
Qt用于在每个平台上模拟GUI元素,但现在使用平台的原生样式(尽pipe不是原生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附带了一个小部件devise器,甚至在最近的版本中还有一个IDE来帮助deviseQt软件。
PySide
PySide是一个绑定到Qt的LGPL。 它是由诺基亚开发的,作为GPL PyQt的替代品。
尽pipe基于与现有的GPL许可的PyQt绑定不同的技术,但PySide最初的目标是与它们API兼容。 除了与PyQt兼容的API之外,未来还将提供更多的Pythonic API。
wxPython的
wxPython是使用wxWidgets -Framework的Python绑定。 这个框架在LGPL许可下,由开源社区开发。
我真正缺less的是devise界面的好工具,他们有3个左右,但没有一个是可用的。
我应该提到的一件事是,尽pipe事实上我没有使用任何先进的东西,但是我在tab-view中发现了一个bug。 (仅适用于Mac OS X)我认为wxWidgets不如Qt 。
wxPython实际上只是关于GUI类,没有其他的东西。
wxWidgets使用本地GUI元素。
wxPython对Tkinter的一个优点是wxPython有一个更大的小部件库可供select。
其他
我没有任何其他GUI框架的经验,也许别人有。
如果有人知道比通常讨论的更好的东西,我一定会感激。 我觉得头痛发现适当的东西…
Qt很好,但PyQt似乎没有相同的开发资源。 它似乎有一些聪明的方式来生成绑定,但不完整(例如PyKDEterminalkpart)和缺乏文档(如开发人员承认)。 与Qt的UIdevise师的兼容性很好。
wxpython – 控件看起来不太好,widget库不如KDE那么大。
OpenGL的 – 甚至不支持默认的字体… pygame是好的,但是作为一个状态机的opengl太烦人了(面向对象的模型阻止进行错误的状态调用)。
XUL – 整洁的想法,我希望它的工作。 pyxulrunner教程不适合我,虽然 – 首先我必须将xulrunner / usr / libpath添加到LD_LIBRARY_PATH,然后它仍然有问题“从xpcom导入组件”…
我的一个ui图书馆的愿望是
- Python集成(即使用像unicode一样的内置函数,线程等模块以及闭包等语言特性)
- 良好的中间表示(像XUL,而不是像“listbox91.addChild(label28)”那样产生数百行)
- 简单的多线程支持(自动锁或事件发布,例如elt.setText可以从任何线程中调用;如果需要,让devise人员用Python锁pipe理locking)
- 以用户为中心的function – 对一系列UI事件编写脚本,绑定任何东西的能力(KDE有dcop,但是afaik绑定不是由UI库自动完成的),以及拦截事件。
- 一个大型,易于贡献的标准库的潜力。
- 文件,但如果图书馆devise得很好,并产生足够的兴趣,这将是一个给定的。
根据我的经验,html比UI库更容易获得好看的东西。
编辑 – 使用PyQt 4一段时间后,它完成了简单的用户界面的工作。 我目前没有为最终用户开发,所以看起来不重要。 QTextBrowser对于显示基本的HTML表格和生成HTML链接非常有用。
我只是在说,TKinter糟透了。 遗憾的是,它似乎是因为向后兼容而与Python打包在一起的。
该文件是可怕的。 看起来很可怕 我遇到了一些奇怪的错误,实际上会使Python崩溃。
Jython 。
Jython是用100%纯Java编写的高级dynamic的面向对象语言Python的实现,并与Java平台无缝集成。 因此,它允许您在任何Java平台上运行Python。
您可以使用Swing,Applet或Java平台可用的其他GUI框架。 请参阅用于graphics用户界面和2Dgraphics的 Java教程 。 有大量的书籍和文档 ,如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 小程序,演示了multithreading粒子绘图 (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())
如果你只是对绘制线条和圆圈感兴趣,你可能会把它缩小到一半。
临wxPython
- 很多教程
- 作为编辑wxGlade:不完美,但可用。