建立在: 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可以按原样工作,而不会生成大量的MB文件)
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 - 其他人? (指定)答案 0 :(得分:44)
请不要犹豫,扩大这个答案。
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风格的许可证。
它构建于Qt之上,是一个C ++框架。它非常先进,并且有一些很好的工具,比如Qt Designer来设计你的应用程序。你应该知道,它不像Python 100%,但接近它。 documentation非常好
这个框架非常好。它由诺基亚旗下的奇趣科技积极开发。 Python的绑定由Riverbank开发。
PyQt根据GPL许可证或商业许可证提供。河岸PyQt许可证的价格约为每个开发商400欧元。
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是与Qt绑定的LGPL。它由诺基亚开发,作为GPL PyQt的替代品。
虽然基于不同 技术比现有技术 GPL许可的PyQt绑定,PySide 最初的目标是 API兼容它们。此外 与PyQt兼容的API,更多 Pythonic API将在 将来
wxPython是使用wxWidgets - Framework的Python绑定。该框架受LGPL许可,由开源社区开发。
我真正缺少的是设计界面的好工具,它们大约有3个,但没有一个可用。
我应该提到的一点是,我在标签视图中发现了一个错误,尽管事实上我没有使用任何先进的东西。 (仅限Mac OS X)我认为wxWidgets不如Qt那么精致。
wxPython实际上只关于GUI类,没有太多其他内容。
wxWidgets使用本机GUI元素。
wxPython优于Tkinter的一个优点是wxPython有一个更大的小部件库可供选择。
我没有任何其他GUI框架的经验,也许是其他人的。
答案 1 :(得分:6)
Jython是一个实现 高层次,动态,面向对象 语言Python以100%Pure编写 Java,与之无缝集成 Java平台。因此它允许你 在任何Java平台上运行Python。
您可以使用Swing,Applet或Java平台可用的其他GUI框架。有关Java Tutorials和Graphical User Interfaces的信息,请参见2D Graphics。有很多书和documentation,例如API reference。
这是来自An Introduction to 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()
这是一个Jython applet 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())
如果你只想绘制线条和圆圈,你可以把它缩小到一半。
答案 2 :(得分:6)
我只是在说TKinter很糟糕。遗憾的是,由于向后兼容性,它被Python打包。
文档太可怕了。看起来很可怕。我遇到了一些奇怪的错误,实际上会让Python崩溃。
答案 3 :(得分:5)
如果有人知道比通常讨论的更好的东西,我绝对会感激不尽;我觉得头痛找到合适的东西......
Qt很棒,但PyQt似乎没有相同的开发资源。它似乎有一些聪明的方法来生成绑定,但是不完整(例如PyKDE终端kpart)并且缺乏文档(正如开发人员所承认的那样)。与Qt的UI设计器的兼容性很好。
wxpython - 控件看起来不太好看,小部件库没有KDE那么大。
OpenGL - 默认情况下甚至不支持字体... pygame没关系,但是opengl是一个状态机太烦人了(面向对象的模型阻止了调用处于错误的状态)。
XUL - 整洁的想法,我希望它有效。 pyxulrunner教程对我不起作用 - 首先我必须将xulrunner / usr / lib路径添加到LD_LIBRARY_PATH,然后它仍然存在“来自xpcom导入组件”的问题......我的ui图书馆愿望清单
根据我的经验,html比UI库更容易获得好看的东西。
编辑 - 在使用PyQt 4一段时间后,它可以完成简单UI的工作。我目前没有为最终用户开发,所以看起来并不重要。 QTextBrowser对于显示基本HTML表和生成HTML链接非常有用。
答案 4 :(得分:0)
Pro wxPython