添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

你应该使用哪个Python GUI库? 2024年 Python GUI 库比较

Python是一种流行的编程语言,用于从脚本编写日常任务到构建网站和执行复杂的数据分析。虽然你可以用命令行工具完成很多工作,但有些任务更适合图形界面。您可能还会发现自己想为现有工具构建一个桌面前端,以提高非技术用户的可用性。或者,你可能正在构建一些硬件或移动应用程序,并希望有一个直观的触摸屏界面。

要使用Python创建图形用户界面,您需要一个GUI库。不幸的是,在这一点上,事情变得相当混乱——Python有许多不同的GUI库可供使用,所有库都有不同的功能和许可。你的项目应该使用哪个Python GUI库?

在本文中,我们将介绍目前最流行的Python GUI框架,以及为什么你应该考虑在自己的项目中使用它们。您将了解每个库的相对优势,了解许可限制,并看到一个简单的Hello,World!应用程序写在每个。在本文结束时,您应该有信心为您的项目选择合适的库。

如果你想构建专业质量的软件,可以从PySide6或PyQt6开始。

Tkinter

最适合简单的工具GUI、小型便携式应用程序

Tkinter是Python的事实上的GUI框架。它与Windows和macOS上的Python捆绑在一起。(在Linux上,可能需要从发行版的仓库下载额外的包。)Tkinter是围绕Tk GUI工具包编写的包装器。它的名字是Tk和Interface两个词的混合体。

Tkinter是一个简单的库,支持标准布局和小部件,以及更复杂的小部件,如标签视图和进度条。Tkinter是一个纯GUI库,而不是一个框架。它没有内置对数据源、数据库驱动的GUI的支持,也没有对显示或操纵多媒体或硬件的支持。但是,如果你需要制作一些不需要任何额外依赖的简单东西,Tkinter可能就是你想要的。Tkinter是跨平台的,但小部件可能看起来过时,特别是在Windows上。

下面显示了Tkinter中一个简单的hello world应用程序。

import tkinter as tk
window = tk.Tk()
window.title("Hello World")
def handle_button_press(event):
    window.destroy()
button = tk.Button(text="My simple app.")
button.bind("", handle_button_press)
button.pack()
# Start the event loop.
window.mainloop()

tkinter-windows.webp

Tkinter最初是由Steen Lumholt和Guido Van Rossum开发的,他们设计了Python本身。GUI框架和语言都在相同的Python软件基金会(PSF)许可证下获得许可。虽然该许可证与GPL兼容,但它是一种“许可”许可证(类似于MIT许可证),允许其用于专有应用程序和修改。

PyQt or PySide

最适合商业、多媒体、科学或工程桌面应用程序

PyQt和PySide是Qt框架的包装器。它们允许您轻松创建在任何平台上看起来都像家一样的现代界面,包括Windows、macOS、Linux甚至Android。他们还拥有坚实的工具,其中最著名的是Qt Creator,它包括一个所见即所得编辑器,用于快速轻松地设计GUI界面。由商业项目支持意味着您将找到大量的支持和在线学习资源来帮助您开发应用程序。

Qt(以及扩展的PyQt&PySide)不仅仅是一个GUI库,而是一个完整的应用程序开发框架。除了小部件和布局等标准UI元素外,Qt还提供了类似MVC的数据驱动视图(电子表格、表格)、数据库界面和模型、图形绘制、矢量图形可视化、多媒体播放、音效和播放列表以及打印等硬件的内置界面。Qt信号和插槽模型允许使用可重用和隔离的组件构建大型应用程序。

虽然其他工具包在构建小型和简单的工具时可以很好地工作,但Qt在构建真正的商业质量应用程序时确实发挥了作用,您将从预构建的组件中受益。这是以轻微的学习曲线为代价的。然而,对于较小的项目,Qt并不比其他库复杂。基于Qt Widgets的应用程序使用平台原生小部件,以确保它们在Windows、macOS和基于Qt的Linux桌面上看起来和感觉都很自在。

下面分别展示了使用 PyQt6 和 PySIde6 开发的一个简单 hello world 应用程序。

PyQt6

from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton
import sys
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Hello World")
        button = QPushButton("My simple app.")
        button.pressed.connect(self.close)
        self.setCentralWidget(button)
        self.show()
app = QApplication(sys.argv)
w = MainWindow()
app.exec()

PySide6

from PySide6.QtWidgets import QMainWindow, QApplication, QPushButton
import sys
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Hello World")
        button = QPushButton("My simple app.")
        button.pressed.connect(self.close)
        self.setCentralWidget(button)
        self.show()
app = QApplication(sys.argv)
w = MainWindow()
app.exec()
正如你所看到的,PyQt和PySide之间的代码几乎完全相同,所以当你开始使用任何一种开发时都不必担心:如果需要,你总是可以很容易地迁移。

pyqt6-windows.webp

在Qt公司(诺基亚旗下)于2009年发布官方支持的PySide库之前,Riverbank Computing于1998年发布了PyQt。这两个库之间的主要区别在于许可。免费使用的PyQt版本是根据GNU通用公共许可证(GPL)v3许可的,但PySide是根据GNU较宽松通用公共许可协议(LGPL)许可的。这意味着PyQt是有限的GPL许可应用程序,除非您购买其商业版本,而PySide可以在非GPL应用程序中使用,无需任何额外费用。但是,请注意,这两个库都与Qt本身是分开的,Qt本身也有一个免费使用的开源版本和一个付费的商业版本。

PyQt/PySide with QML

最适合Raspberry Pi、微控制器、工业和消费电子产品

当使用PyQt和PySide时,您实际上有两种构建GUI的选择。我们已经介绍了Qt Widgets API,它非常适合构建桌面应用程序。但Qt也以Qt Quick/QML的形式提供了一个声明性的API。

使用Qt Quick/QML,您可以访问整个Qt框架来构建应用程序。UI由两部分组成:处理业务逻辑的Python代码和定义UI本身的结构和行为的QML。您可以从Python控制UI,也可以使用嵌入式Javascript代码来处理事件和动画。

Qt Quick/QML非常适合为微控制器或设备接口构建现代触摸屏接口,例如为Raspberry Pi等微控制器构建接口。但是,您也可以在桌面上使用它来构建完全定制的应用程序体验,就像您在Spotify等媒体播放器应用程序或桌面游戏中找到的那样。

PyQt6中带有QML的简单Hello World应用程序。将QML文件保存在与Python文件相同的文件夹中,并正常运行。

main.py

import sys
from PyQt6.QtGui import QGuiApplication
from PyQt6.QtQml import QQmlApplicationEngine
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.quit.connect(app.quit)
engine.load('main.qml')
sys.exit(app.exec())

main.qml

import QtQuick 2.15
import QtQuick.Controls 2.15
ApplicationWindow {
    visible: true
    width: 600
    height: 500
    title: "HelloApp"
    Text {
        anchors.centerIn: parent
        text: "Hello World"
        font.pixelSize: 24
}

Qt Quick/QML应用程序的许可与其他PyQt/PySide应用程序相同。

PyQt

PySide

pyqt6qml-windows.webp

Kivy

最适合Python移动应用程序开发

虽然大多数其他GUI框架都是用其他编程语言编写的工具包的绑定,但Kivy可能是唯一一个主要用纯Python编写的框架。如果你想创建面向触摸屏的界面,并专注于Android和iOS等移动平台,这是一条路。这也可以在桌面平台(Windows、macOS、Linux)上运行,但请注意,您的应用程序的外观和行为可能与本机应用程序不同。然而,围绕这个框架有一个相当大的社区,你可以很容易地找到资源来帮助你在线学习。

Kivy的外观和感觉是非常可定制的,允许它作为Pygame(用于用Python制作游戏)等库的替代品。开发人员还为Kivy发布了许多单独的库。有些为Kivy提供了更好的集成和访问某些平台特定功能的能力,或者帮助打包您的应用程序,以便在Android和iOS等平台上分发。Kivy有自己的设计语言Kv,类似于Qt的QML。它允许您轻松地将界面设计与应用程序的逻辑分开。

Kivy有一个名为KivyMD的第三方插件,它将Kivy的小部件替换为符合谷歌Material Design的小部件。

Kivy中的一个简单的hello world应用程序如下所示。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.core.window import Window
Window.size = (300, 200)
class MainWindow(BoxLayout):
    def __init__(self):
        super().__init__()
        self.button = Button(text="Hello, World?")
        self.button.bind(on_press=self.handle_button_clicked)
        self.add_widget(button)
    def handle_button_clicked(self, event):
        self.button.text = "Hello, World!"
class MyApp(App):
    def build(self):
        self.title = "Hello, World!"
        return MainWindow()
app = MyApp()
app.run()

kivy-windows.webp

2011年2月,Kivy作为类似框架PyMT的精神继承者被释放。虽然他们有着相似的目标,也由Kivy的当前核心开发人员领导,但Kivy的不同之处在于其底层设计和一个积极开发和维护它的专业组织。Kivy是根据MIT许可证获得许可的,这是一种“许可”许可证,允许您在开源和专有应用程序中自由使用它。因此,您甚至可以对框架本身进行专有修改。

PySimpleGUI

最适合为简单工具快速构建UI,非常便携

PySimpleGUI 5使用商业软件的付费订阅模式。非商业发行版要求开发人员和接收者都拥有活动的PySimpleGUI订阅。

PySimpleGUI旨在简化Python的GUI应用程序开发。它并没有重新发明轮子,而是为Tkinter、Qt(PySide 2)、WxPython和Remi等其他现有框架提供了一个包装器。通过这样做,它降低了创建GUI的障碍,但也允许您通过简单地更改导入语句轻松地从一个GUI框架迁移到另一个框架。

虽然每个框架都有一个单独的PySimpleGUI端口,但Tkinter版本被认为是功能最完整的版本。然而,包装其他库是有代价的——您的应用程序将无法利用底层库的全部功能或性能。纯Python事件循环也会通过使用GIL设置事件瓶颈来阻碍性能。然而,只有在使用实时数据可视化、流媒体或多媒体应用程序时,这才是真正值得关注的问题。

import PySimpleGUI as sg
layout = [
    [sg.Button("My simple app.")]
window = sg.Window("Hello World", layout)
while True:
    event, values = window.read()
    print(event, values)
    if event == sg.WIN_CLOSED or event == "My simple app.":
        break
window.close()

pysimplegui-windows.webp

PySimpleGUI的许可证与PySide的LGPL v3许可证相同,允许在专有应用程序中使用,但对框架本身的修改必须作为开源发布。

WxPython

最适合简单的便携式桌面应用程序

WxPython是流行的跨平台GUI工具包WxWidgets的包装器。它被实现为一组Python扩展模块,这些模块封装了流行的wxWidgets跨平台库的GUI组件,该库是用C++编写的。

WxPython在大多数平台上使用本机小部件,确保您的应用程序看起来和感觉就像在家里一样。然而,众所周知,WxPython具有某些特定于平台的怪癖,并且它也没有在平台之间提供与Qt相同的抽象级别。这可能会影响维护应用程序跨平台兼容性的难易程度。

WxPython正在积极开发中,目前也正在以“WxPython Phoenix”的名义从头开始重新实现。WxWidgets背后的团队还负责WxPython,该版本最初于1998年发布。

import wx
class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200, -1))
        self.button = wx.Button(self, label="My simple app.")
        self.Bind(
            wx.EVT_BUTTON, self.handle_button_click, self.button
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.button)
        self.SetSizer(self.sizer)
        self.SetAutoLayout(True)
        self.Show()
    def handle_button_click(self, event):
        self.Close()