建立在: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 - 其他人?(请注明)
请不要犹豫,扩大这个答案.
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软件.
PySidePySide是与Qt绑定的LGPL.它由诺基亚开发,作为GPL PyQt的替代品.
wxPython的尽管PySide基于与现有GPL许可的PyQt绑定不同的技术,但最初的目标是与它们API兼容.除了PyQt兼容的API之外,将来还会提供更多的Pythonic API.
wxPython是使用wxWidgets -Framework 对Python的绑定.该框架受LGPL许可,由开源社区开发.
我真正缺少的是设计界面的好工具,他们有大约3个,但没有一个是可用的.
我应该提到的一件事是,尽管我没有使用任何先进的东西,但我在标签视图中发现了一个错误.(仅限Mac OS X)我认为wxWidgets并不像Qt那样优秀.
wxPython实际上只是关于GUI类,没有其他的东西.
wxWidgets使用本机GUI元素.
wxPython优于Tkinter的一个优点是wxPython有一个更大的小部件库可供选择.
其他我没有任何其他GUI框架的经验,也许其他人有.
我只是想说TKinter很糟糕.遗憾的是,由于向后兼容性,它被Python打包.
文档太可怕了.看起来很可怕.我遇到了一些奇怪的错误,实际上会让Python崩溃.
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())
如果你只想绘制线条和圆圈,你可以把它减少一半.
如果有人知道比通常讨论的更好的东西,我肯定会感激.我觉得头痛找到合适的东西......
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链接非常有用.