2009-02-06 721 views
46

Building on: http://www.reddit.com/r/Python/comments/7v5ra/whats_your_favorite_gui_toolkit_and_why/Cross-nền tảng cho việc triển khai các ứng dụng Python

khen:

1 - dễ dàng thiết kế/hội nhập - đường cong học tập

2 - Hỗ trợ/sẵn sàng cho * nix, Windows, Mac, các điểm bổ sung cho native l & f, hỗ trợ cho thiết bị di động hoặc web

3 - pythonic API

4 - chất lượng tài liệu - Tôi muốn làm điều gì đó phức tạp hơn một chút, giờ thì sao?

5 - ánh sáng bao bì trọng lượng vì vậy nó không cần thiết để bao gồm một trình cài đặt đầy đủ (py2exe, py2app sẽ lý tưởng làm việc như nó vốn có và không tạo ra một tập tin MBS gazillion)

6 - cấp phép

7 - những người khác ? (Ghi rõ)


cử viên:

1 - Tkinter, như hiện nay được hỗ trợ (như 2,6, 3,0)

2 - thư viện pyttk

3 - PyGTK

4 - pyQt

5 - wxPython

6 - HTML-CGI qua khung dựa trên Python (Django, Turbogears, web.py, Pylons ...) hoặc Dán

7 - khác? (ghi rõ)

+1

html-cgi làm bộ công cụ gui? WTF? – ddaa

+1

Để thay thế cho một cái, nó cũng cho phép điều khiển từ xa ra khỏi hộp. http://deluge-torrent.org/screenshots.php Bạn nói đúng, nhưng câu hỏi phải phù hợp với một dòng ... – nachik

+1

ddaa - vâng, bạn có thể tích hợp máy chủ web (mà python đã có trong lib chuẩn) vào ứng dụng của bạn và sử dụng trình duyệt làm GUI. một số ứng dụng làm điều đó –

Trả lời

43

Vui lòng không ngần ngại mở rộng câu trả lời này.

Tkinter

Tkinter là bộ công cụ mà đi kèm với trăn. Điều đó có nghĩa là bạn đã có mọi thứ bạn cần để viết GUI. Điều đó cũng có nghĩa là nếu bạn chọn để phân phối chương trình của bạn, rất có thể mọi người khác đã có những gì họ cần để chạy chương trình của bạn.

Tkinter là trưởng thành và ổn định, và (ít nhất là cho là) ​​khá dễ sử dụng.Tôi thấy nó dễ sử dụng hơn wxPython, nhưng rõ ràng đó là hơi chủ quan.

Tkinter trở nên tồi tệ vì trông xấu xí và lỗi thời. Mặc dù thật dễ dàng để tạo GUI xấu với Tkinter, nhưng cũng khá dễ dàng để tạo các giao diện đẹp mắt. Tkinter không nắm tay bạn, nhưng nó cũng chẳng cản trở gì cả. Tkinter trông đẹp nhất trên Mac và Windows vì nó sử dụng các tiện ích gốc ở đó, nhưng có vẻ OK trên linux.

Điểm khác về giao diện của Tkinter là, phần lớn, trông không quan trọng bằng cách mọi người tạo ra nó. Hầu hết các ứng dụng được viết bằng các bộ công cụ như Tkinter, wxPython, PyQT, vv là các ứng dụng có mục đích đặc biệt. Đối với các loại ứng dụng, các bộ công cụ này được sử dụng cho, khả năng sử dụng của giao diện. Nếu giao diện của ứng dụng là quan trọng, thật dễ dàng để đánh bóng một ứng dụng Tkinter.

Tkinter có một số tính năng mà các bộ công cụ khác không đến gần khớp. Các dấu vết thay đổi, các phông chữ được đặt tên, các trình quản lý hình học (layout) và cách xử lý sự kiện Tkinter vẫn là tiêu chuẩn mà các bộ công cụ khác cần được đánh giá.

Mặt khác, Tkinter là một trình bao bọc xung quanh một trình thông dịch Tcl chạy bên trong python. Điều này chủ yếu là vô hình đối với bất kỳ ai phát triển với Tkinter, nhưng đôi khi nó dẫn đến thông báo lỗi cho thấy kiến ​​trúc này. Bạn sẽ nhận được một lỗi phàn nàn về một widget với một tên như ".1245485.67345" mà sẽ làm cho hầu như không có ý nghĩa với bất cứ ai trừ khi bạn cũng đã quen thuộc với cách Tcl/tk hoạt động.

Một nhược điểm khác là Tkinter không có nhiều tiện ích dựng sẵn như wxPython. Tiện ích cây phân cấp trong Tkinter hơi yếu, chẳng hạn, và không có tiện ích bảng tích hợp. Mặt khác, các vật dụng văn bản và vải của Tkinter cực kỳ mạnh mẽ và dễ sử dụng. Đối với hầu hết các loại ứng dụng bạn sẽ viết, tuy nhiên, bạn sẽ có mọi thứ bạn cần. Chỉ cần không mong đợi để tái tạo Microsoft Word hoặc Photoshop với Tkinter.

Tôi không biết giấy phép là gì cho Tkinter, tôi giả định giống như đối với toàn bộ python. Tcl/tk có giấy phép kiểu BSD.

PyQt

Đó là xây dựng trên đầu trang của Qt, C++ khuôn khổ. Nó khá tiên tiến và có một số công cụ tốt như Qt Designer để thiết kế các ứng dụng của bạn. Tuy nhiên, bạn nên biết rằng nó không giống như Python 100%, nhưng gần với nó. Các documentation là tuyệt vời

Khung này thực sự tốt. Nó đang được phát triển bởi Trolltech, người được sở hữu bởi Nokia. Các ràng buộc cho Python được phát triển bởi Riverbank.

PyQt có sẵn theo giấy phép GPL hoặc bản quyền thương mại. Giá của một giấy phép PyQt bờ sông là khoảng 400 euro cho mỗi nhà phát triển.

Qt không chỉ là một khung công tác GUI mà còn có nhiều lớp khác nữa, người ta có thể tạo một ứng dụng bằng cách chỉ sử dụng các lớp Qt. (Giống như SQL, mạng, kịch bản, ...)

Qt sử dụng để mô phỏng các yếu tố GUI trên mọi nền tảng nhưng bây giờ sử dụng phong cách bản địa của các nền tảng (mặc dù không có nguồn gốc bộ công cụ GUI): xem the documentation for Mac OS Xthe windows XP style

Bao bì là như đơn giản như chạy py2exe hoặc pyInstaller. Nội dung của ứng dụng PyQt của tôi trông như thế này trên cửa sổ (Tôi đã sử dụng InnoSetup trên đầu trang của nó để cài đặt thích hợp):

 
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 đi kèm với một nhà thiết kế phụ tùng và thậm chí cả trong các phiên bản gần đây với một IDE để giúp thiết kế Qt phần mềm.

PySide

PySide là một liên kết LGPL với Qt. Nó được phát triển bởi nokia như một sự thay thế cho GPL PyQt.

Mặc dù dựa trên một công nghệ khác với bindings PyQt cấp phép GPL hiện có, PySide ban đầu sẽ mong muốn được API tương thích với họ.Ngoài ra, vào API tương thích PyQt, thêm API Pythonic sẽ được cung cấp trong tương lai .

wxPython

wxPython là một ràng buộc cho Python sử dụng wxWidgets -Framework. Khung này nằm trong giấy phép LGPL và được phát triển bởi cộng đồng nguồn mở.

Những gì tôi thực sự thiếu là một công cụ tốt để thiết kế giao diện, họ có khoảng 3 nhưng không ai trong số họ là có thể sử dụng.

Một điều tôi nên đề cập đến là tôi đã tìm thấy lỗi trong chế độ xem tab mặc dù thực tế là tôi không sử dụng bất kỳ thứ gì nâng cao. (Chỉ trên Mac OS X) tôi nghĩ rằng wxWidgets không được đánh bóng như Qt.

wxPython thực sự chỉ là về các lớp GUI, không có nhiều thứ khác.

wxWidgets sử dụng các phần tử GUI gốc.

Lợi thế wxPython có trên Tkinter là wxPython có thư viện tiện ích lớn hơn nhiều để chọn từ đó.

Khác

Tôi chưa có kinh nghiệm với các khung công tác GUI khác, có thể một người khác có.

+0

Qt mô phỏng các tiện ích Windows nguyên bản, và tôi chưa thấy một cái gì đó không đủ tự nhiên, vì vậy cho tất cả các mục đích thực tế chúng * là * native –

+0

Tôi đã thay đổi nó, nhưng tại sao không tự mình làm, đó là một cộng đồng wiki sau khi tất cả. –

+0

"Những gì tôi thực sự thiếu là một công cụ tốt để thiết kế giao diện, họ có khoảng 3 nhưng không ai trong số họ là có thể sử dụng." Tôi nghĩ rằng phương pháp tốt nhất là mã Khung chính bằng tay và sử dụng wxGlade cho các hộp thoại và v.v. Tôi đồng ý các nhà thiết kế có thể tốt hơn. –

0

Pro wxPython

  • Rất nhiều hướng dẫn
  • wxGlade như một biên tập: chưa hoàn hảo, nhưng có thể sử dụng.
5

Tôi chắc chắn sẽ đánh giá cao nếu bất kỳ ai biết điều gì đó tốt hơn những gì thường được thảo luận; Tôi thấy bị đau đầu khi tìm kiếm thứ gì đó phù hợp ...

Qt rất tuyệt, nhưng PyQt dường như không có tài nguyên phát triển giống nhau. Dường như có một số cách thông minh để tạo ra các ràng buộc, nhưng không hoàn thành (ví dụ: PyKDE terminal kpart) và có một số tài liệu (như các nhà phát triển thừa nhận). Khả năng tương thích với thiết kế UI của Qt rất hay.

wxpython - điều khiển không đẹp mắt, thư viện tiện ích con không lớn bằng KDE.

OpenGL - thậm chí không hỗ trợ phông chữ theo mặc định ... pygame là okay, nhưng opengl là một máy trạng thái quá khó chịu (mô hình hướng đối tượng ngăn chặn thực hiện cuộc gọi ở trạng thái sai).

XUL - ý tưởng gọn gàng, tôi ước nó hoạt động. Hướng dẫn pyxulrunner không hoạt động đối với tôi, mặc dù - trước hết tôi phải thêm đường dẫn xulrunner/usr/lib vào LD_LIBRARY_PATH, sau đó nó vẫn gặp sự cố với "từ các thành phần nhập xpcom" ...

danh sách yêu thích của tôi cho một thư viện giao diện người dùng sẽ

  • Python tích hợp (ví dụ sử dụng dựng sẵn như unicode, mô-đun như luồng, và các tính năng ngôn ngữ như đóng cửa)
  • tốt đại diện trung gian (như XUL thay vì tạo ra hàng trăm dòng trông như "listbox91.addChild (label28) ")
  • đơn giản hỗ trợ mutlithreaded (khóa tự động hoặc sự kiện đăng để ví dụ elt.setText có thể được gọi từ bất kỳ thread; cho phép các nhà thiết kế quản lý khóa với ổ khóa Python nếu cần thiết)
  • tính năng người dùng làm trung tâm cũng như - kịch bản của một chuỗi các sự kiện giao diện người dùng, khả năng keybind bất cứ điều gì (KDE có dcop, nhưng afaik ràng buộc không được thực hiện tự động bởi thư viện giao diện người dùng), và đánh chặn các sự kiện.
  • tài liệu, mặc dù nếu thư viện được thiết kế tốt và tạo ra đủ sự quan tâm, thì đây sẽ là một tài liệu được cung cấp.

Theo kinh nghiệm của tôi, html dễ dàng hơn nhiều để có được thứ gì đó đẹp hơn thư viện UI.

chỉnh sửa - sau khi làm việc với PyQt 4 trong một thời gian, nó hoàn thành công việc cho giao diện người dùng đơn giản. Tôi hiện không phát triển cho người dùng cuối, vì vậy có vẻ không quan trọng. QTextBrowser rất hữu ích để hiển thị các bảng HTML cơ bản và tạo các liên kết HTML.

+0

Tôi không hiểu khiếu nại của bạn về PyQt. Chỉ có một người làm việc trên nó, vâng, nhưng công việc khá đơn giản: ánh xạ C++ Qt DLL trong python, và nó được thực hiện bởi một công cụ tự động nhâm nhi. Công việc của anh chàng đó chỉ là để duy trì ngụm, điều mà anh ấy đã làm rất tốt trong 9 năm qua. Sau đó, bạn phàn nàn về PyKDE nhưng điều này là không quan trọng, câu hỏi là về Qt. –

+0

Tôi biết điều đó; Tôi không cố tấn công anh ta. Như tôi đã nói trong phần chỉnh sửa ở phía dưới, Qt đã hoàn thành công việc cho tôi. Tôi chỉ đơn giản là cố gắng để đánh giá toàn bộ bộ công cụ gui, bất kể những gì dự án đặt ra để làm (hoặc những gì là lỗi của Qt so với PyQt). Câu hỏi liên quan đến bất kỳ bộ công cụ GUI nào và nhiều tính năng hấp dẫn, ví dụ: tích hợp đầu cuối, vv là các tiện ích đi kèm với KDE (và PyKDE chưa hoàn thành). Hơn nữa, giai đoạn tạo mã không linh hoạt như các tùy chọn khác; ví dụ. để tải một tệp resource.rc chung không có trong cùng thư mục với GUI, người ta phải sửa đổi sys.path. – gatoatigrado

5

Jython.

Jython là một thực hiện các cấp cao, năng động, hướng đối tượng Python ngôn ngữ viết bằng 100% Pure Java, và tích hợp liền mạch với nền tảng Java. Do đó, nó cho phép bạn chạy Python trên bất kỳ nền tảng Java nào.

Bạn có thể sử dụng Swing, Applet hoặc các khung công tác GUI khác có sẵn cho nền tảng Java. Xem Java Tutorials cho Graphical User Interfaces2D Graphics. Có rất nhiều sách và documentation chẳng hạn như API reference.

Đây là ứng dụng Hello world Swing từ 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() 

Đây là Jython applet by Todd Ditchendorf that demonstrates multi-threaded particle drawing (60 dòng).

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()) 

Nếu bạn chỉ muốn vẽ đường và vòng tròn, bạn có thể cắt giảm xuống một nửa.

+0

Bạn đang đề xuất gì về GUI GUI của Java? Làm thế nào lớn là nó - trang của doc, dòng mã cho biết một canvas với vẽ rect/line/text? Cảm ơn – denis

+1

một caveat, jython không làm việc với các mô-đun python yêu cầu một giao diện C – burkestar

5

Tôi chỉ cân nhắc để nói rằng TKinter hút. Có vẻ như nó được đóng gói với Python vì khả năng tương thích ngược.

Tài liệu này thật kinh khủng. Nó trông ghê quá. Tôi đã chạy vào một số lỗi kỳ lạ mà thực sự sẽ sụp đổ Python.

+3

FWIW, tôi đã có wxPython tai nạn trên tôi _ biên độ của cường độ more_ hơn tkinter. Tôi đoán tất cả phụ thuộc vào cách bạn đang sử dụng nó, phiên bản nào và nền tảng nào. –