PyQt 很多人在用,但用在公司的產品上,可能要考慮授權或付費問題。使用較多人在用的,遇到問題時會有比較多人幫忙解決。
目前 amazon書店出最多書的是Tkinter, 其次是pyqt:
https://www.amazon.com/s?k=python+gui
一份統計Best Python GUI Framework|Toolkits 2019 [Ultimate Guide]的調查, 前10名順序如下:
https://techsore.com/best-python-gui/
- Tkinter
- Kivy
- PyQT
- WxPython
- Libavg
- PySide
- PyGUI
- Pyforms
- Wax Python GUI
- PySimpleGUI
這篇文章介紹的順序如下:
- Eel
- Kivy
- Flexx
- PyQt
- wxPython
- Tkinter
- PySimpleGUI
- PyGObject
- PySide2 / PySide6
- Streamlit
Eel
https://github.com/samuelhwilliams/Eel
Eel is a little Python library for making simple Electron-like offline HTML/JS GUI apps, with full access to Python capabilities and libraries.
Eel 是一個python輕量級的GUI第三方的module,可以透過local 伺服器實現web與python之間的溝通,所以整個介面會以網頁方式呈現(會用chrome開啟),也就是可以用HTML 與CSS 去控制呈現的風格,然後用JS 與python 互相呼叫。
如果你的GUI都放在 web 目錄下,可以使用下面script 來啟動你的GUI:
import eel
eel.init('web')
eel.start('main.html')
This will start a webserver on the default settings (http://localhost:8000) and open a browser to http://localhost:8000/main.html.
If Chrome or Chromium is installed then by default it will open in that in App Mode (with the --app cmdline flag), regardless of what the OS’s default browser is set to (it is possible to override this behaviour).
參考看看教學文章:
Python Eel 創造個人網頁GUI桌面應用程式(入門篇)
https://medium.com/@neutron0916/2500b38ed070
使用 electron 來發佈執行檔,在打包時會佔用較多的空間,網友反應執行時的效能不會太差,只是因為用chromium 核心所以記憶體用量會稍微高一點。
Kivy
Kivy是一個開源工具包能夠讓使用相同原始碼創建的程序能跨平台運行。它主要關注創新型用戶介面開發,如:多點觸摸應用程式。Kivy還提供一個多點觸摸滑鼠模擬器。當前支持的平台包括:Linux、Windows、Mac OS X和Android。
Kivy擁有能夠處理動畫、緩存、手勢、繪圖等功能。它還內置許多用戶介面控制項如:按紐、攝影機、表格、Slider和樹形控制項等。
程式範例:
from kivy.app import App
from kivy.uix.button import Button
class TestApp(App):
def build(self):
return Button(text='Hello World')
TestApp().run()
執行畫面:

Flexx
http://flexx.readthedocs.io/en/latest/
Flexx 是一個純 Python 工具包,用來創建圖形化介面應用程式。其使用 Web 技術進行介面的渲染。你可以用 Flexx 來創建桌面應用,同時也可以導出一個應用到獨立的 HTML 文檔。因為使用純 Python 開發,所以 Flexx 是跨平台的。只需要有 Python 和瀏覽器就可以運行。
執行畫面:

PyQt
https://wiki.python.org/moin/PyQt
PyQt是Qt庫的Python版本。PyQt3支持Qt1到Qt3。 PyQt4支持Qt4。它的首次發布也是在1998年,但是當時它叫 PyKDE,因為開始的時候SIP和PyQt沒有分開。PyQt是用SIP寫的。PyQt 提供 GPL版和商業版。意思是使用 PyQt 做出商業用途是需要付錢的。
Q:PyQt5, 不過我有遇到多執行執行緒時,無法使用彈出視窗(警示窗)的問題!
A:原因是因為子線程不能夠顯示介面,只要在子執行緒傳個signal到主線程,再顯示就可以。
PyQt5 授權:
http://pyqt.sourceforge.net/Docs/PyQt5/introduction.html#license

wxPython
wxPython 是 Python 語言的一套優秀的 GUI 圖形庫,允許 Python 程式設計師很方便的創建完整的、功能鍵全的 GUI 用戶介面。 wxPython 是作為優秀的跨平台 GUI 庫 wxWidgets 的 Python 封裝和 Python 模塊的方式提供給用戶的。
就如同Python和wxWidgets一樣,wxPython也是一款開源軟體,並且具有非常優秀的跨平台能力,能夠運行在32位windows、絕大多數的Unix或類Unix系統、Macintosh OS X上。
範例程式:
#!/bin/python
"""
Hello World, but with more meat.
"""
import wx
class HelloFrame(wx.Frame):
"""
A Frame that says Hello World
"""
def __init__(self, *args, **kw):
# ensure the parent's __init__ is called
super(HelloFrame, self).__init__(*args, **kw)
# create a panel in the frame
pnl = wx.Panel(self)
# and put some text with a larger bold font on it
st = wx.StaticText(pnl, label="Hello World!", pos=(25,25))
font = st.GetFont()
font.PointSize += 10
font = font.Bold()
st.SetFont(font)
# create a menu bar
self.makeMenuBar()
# and a status bar
self.CreateStatusBar()
self.SetStatusText("Welcome to wxPython!")
def makeMenuBar(self):
"""
A menu bar is composed of menus, which are composed of menu items.
This method builds a set of menus and binds handlers to be called
when the menu item is selected.
"""
# Make a file menu with Hello and Exit items
fileMenu = wx.Menu()
# The "\t..." syntax defines an accelerator key that also triggers
# the same event
helloItem = fileMenu.Append(-1, "&Hello...\tCtrl-H",
"Help string shown in status bar for this menu item")
fileMenu.AppendSeparator()
# When using a stock ID we don't need to specify the menu item's
# label
exitItem = fileMenu.Append(wx.ID_EXIT)
# Now a help menu for the about item
helpMenu = wx.Menu()
aboutItem = helpMenu.Append(wx.ID_ABOUT)
# Make the menu bar and add the two menus to it. The '&' defines
# that the next letter is the "mnemonic" for the menu item. On the
# platforms that support it those letters are underlined and can be
# triggered from the keyboard.
menuBar = wx.MenuBar()
menuBar.Append(fileMenu, "&File")
menuBar.Append(helpMenu, "&Help")
# Give the menu bar to the frame
self.SetMenuBar(menuBar)
# Finally, associate a handler function with the EVT_MENU event for
# each of the menu items. That means that when that menu item is
# activated then the associated handler function will be called.
self.Bind(wx.EVT_MENU, self.OnHello, helloItem)
self.Bind(wx.EVT_MENU, self.OnExit, exitItem)
self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)
def OnExit(self, event):
"""Close the frame, terminating the application."""
self.Close(True)
def OnHello(self, event):
"""Say hello to the user."""
wx.MessageBox("Hello again from wxPython")
def OnAbout(self, event):
"""Display an About Dialog"""
wx.MessageBox("This is a wxPython Hello World sample",
"About Hello World 2",
wx.OK|wx.ICON_INFORMATION)
if __name__ == '__main__':
# When this module is run (not imported) then create the app, the
# frame, show it, and start the event loop.
app = wx.App()
frm = HelloFrame(None, title='Hello World 2')
frm.Show()
app.MainLoop()
執行畫面:

Tkinter
- Python 3: https://docs.python.org/3/library/tk.html
- Python 2: https://docs.python.org/2/library/tkinter.html
Tkinter 是使用python 進行窗口視窗設計的模塊. 簡單的構造, 多平台, 多系統的兼容性, 能讓它成為讓你快速入門定制窗口文件的好助手. 它在python 窗口視窗模塊中是一款簡單型的
Tk 原先是為 Tcl 語言所開發的 GUI 套件, 因為是 Tcl 的第一個擴充, 所以現在都合起來稱呼為 Tcl/Tk. Tcl 是一種以 string-based 的跨平台工具命令式直譯語言 (Tool command language), 繼承了 LISP/C/Shell 等語言的優點, 並具有語法簡單, 容易擴展與可靈活嵌入其他語言的特點, 而且全面支持 unicode.
而 Tkinter 是 Python 內建的標準模組, 內部嵌入了 Tcl/Tk GUI 套件, 用來在 Python 中建構 GUI 圖形介面程式, 它具有如下優點 :
- 簡單易學 :
比 Python 其他 GUI 要容易, 甚至於我覺得比學 Java Swing 還容易. - 程式碼精簡 :
以很短的程式碼便能產生強大功能的 GUI 程式. - 跨平台 :
同樣的程式可以在 Linux/Windows/Mac 等系統上執行.
不過在 Python 2 中的模組名稱 Tkinter 到 Python 3 版後已被改為小寫的 tkinter, 使用時要注意所用之 Python 版本, 匯入時注意該用首字大寫與否. 不過 Python 2 下以 Tkinter 所寫的 GUI 程式可以利用 2to3 程式轉成 Python 3 版的程式.
教學:
https://morvanzhou.github.io/tutorials/python-basic/tkinter/
範例程式:
import Tkinter as tk
win=tk.Tk() #建立視窗容器物件
win.title(“Tk GUI”)
label=tk.Label(win, text=”Hello World!”) #建立標籤物件
label.pack() #顯示元件
button=tk.Button(win, text=”OK”)
button.pack() #顯示元件
win.mainloop()
執行畫面:

Max 學習 tkinter:
https://stackoverflow.max-everyday.com/tag/tkinter/
PySimpleGUI
github:
https://github.com/PySimpleGUI/PySimpleGUI
PySimpleGUI 嘗試解決上述 GUI 難題,它提供了一種簡單明了、易於理解、方便自定義的 GUI 接口。
Install
pip install pysimplegui
or
pip3 install pysimplegui
Sample Code
import PySimpleGUI as sg
All the stuff inside your window.
layout = [ [sg.Text('Some text on Row 1')],
[sg.Text('Enter something on Row 2'), sg.InputText()],
[sg.Button('Ok'), sg.Button('Cancel')] ]
Create the Window
window = sg.Window('Window Title', layout)
Event Loop to process "events" and get the "values" of the inputs
while True:
event, values = window.read()
if event in (None, 'Cancel'): # if user closes window or clicks cancel
break
window.close()
上面程式碼產出視窗

PyGObject
https://pygobject.readthedocs.io/en/latest/
PyGTK是一套用Python封裝的,用於GTK+的GUI庫。PyGTK是在LGPL授權下的自由軟體。它的作者是著名的GNOME開發者James Henstridge。
PyGTK沒有人在維護了, 取而代之的是 PyGObject。
PyGObject is a Python package which provides bindings for GObject based libraries such as GTK, GStreamer, WebKitGTK, GLib, GIO and many more.
It supports Linux, Windows and macOS and works with Python 2.7+, Python 3.5+, PyPy and PyPy3. PyGObject, including this documentation, is licensed under the LGPLv2.1+.
If you want to write a Python application for GNOME or a Python GUI application using GTK, then PyGObject is the way to go. For more information on specific libraries check out the “Python GTK 3 Tutorial” and the “Python GI API Reference”.
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
window = Gtk.Window(title="Hello World")
window.show()
window.connect("destroy", Gtk.main_quit)
Gtk.main()
PySide2 / PySide6
https://wiki.qt.io/Qt_for_Python
PySide是跨平台的應用程式框架Qt的Python綁定版本。在2009年8月,PySide首次發布。提供和PyQt類似的功能,並相容API。但與PyQt不同處為使用LGPL授權。
Qt for Python is available under LGPLv3/GPLv2 and commercial license for the following platforms: Linux / macOS / Windows.
安裝:
pip install PySide2
Sample Code:
import sys
from PySide2.QtWidgets import QApplication, QLabel
if name == "main":
app = QApplication(sys.argv)
label = QLabel("Hello World")
label.show()
sys.exit(app.exec_())
其他已經沒有在維護的,建議避免使用
pyui4win
https://github.com/huqinghua/pyui4win
Python for Win32 (pywin32)
https://github.com/mhammond/pywin32
這個原本沒什麼在維護,最近好像遇到好心人去更新一些檔案。
You can install pywin32 via pip:
pip install pywin32
如果是推薦給初學者中的初學者,可以玩看看這個線上版的的python編輯器:
a simple Python editor for beginner programmers.
https://codewith.mu/
Streamlit
Streamlit 是個可快速製作出 Web 網頁前端的框架,而且不需要任何前端技術,全部都採用 Python 語法。讓你將網路爬蟲、數據科學、機器學習資料簡單地呈現出來分享,是一個很方便的套件。
Streamlit is an open-source app framework for Machine Learning and Data Science teams. Create beautiful data apps in hours, not weeks. All in pure Python.
安裝:
pip install streamlit
使用方法:
streamlit py的程式檔案路徑
pyGTK被pyGObject取代了