Tkinter、WxWidgets 和 PyQt、PySide 之间有什么区别?

Tki*_*dio 2 comparison wxpython tkinter pyqt pyside

我想知道 tkinter、wxWidgets 和 PyQt、PySide 等 GUI 工具包之间有什么区别。他们生成类似的小部件,如列表框、文本引擎、按钮、复选框等。我对那里的类似引擎感到困惑。

\n

我现在正在使用 Tkinter,我发现它\xe2\x80\x99s 缺乏复杂的小部件,例如 table 的使用。我之前尝试过使用树视图,但我发现PyQt和PySide中有\xe2\x80\x99s一个名为QTable的小部件。

\n

我对这些名称和不同的用法感到困惑,特别是我无法区分 PyQt 和 Pyside。

\n

哦,此外,我使用的是 Python 3.9 并在 Ubuntu 22.04 上运行。

\n

Mis*_*iya 8

首先,Python 语言中实际上 存在纯Python GUI 工具包。所有提到的工具包都是绑定。我来说说为什么。

特金特

Tkinter 来自 Python 版本 2 或更早版本,是Python 编程语言中唯一的 标准GUI(图形用户界面)库。它是一个 GUI 工具包,不需要通过Python 中的pipconda或某些包管理器安装(但是,如果您想获得一些好处或直接调用Tcl,您可以从apt gethttps://www.tcl 安装它。 tk/software/tcltk/等)。Tk它是语言内部 GUI 工具包的包装器Tcl

PyPI到目前为止我所知道的GUI 包中有两个,它们PySimplyGUICustomTkinter基于 tkinter 的,但不是从头开始开发 GUI 库。

尽管 Tkinter 被抱怨其界面陈旧、漏洞陈旧且更新缓慢,但它仍然具有以下优势,可以在 GUI 开发世界中“生存”:

  • Tkinter 是Python 语言的直接标准库。这意味着不需要安装,这对于那些没有正确设置或不知道如何使用或或或其他东西的狂热程序员和编码孩子来说是一个巨大的便利。$PATHpipcondaPyQt5

  • 其次,Tkinter 被抱怨其旧式界面。事实上,正如您可能知道的那样(因为您声称您是 Tkinter 用户),有一个名为的模块,ttk它是tk.widgets. 这正在改进其样式配置,并在其中添加一些新的和现代的小部件(例如,ttk.Notebookttk.ComboBox等)

  • 第三,Tkinter 以其简单性和易于学习而闻名。Tkinter 的学习图并不陡峭,而且很简单,因此您可以很快地掌握它。

wxWidgets

wxWidgets是一个封装了GUI框架的GUI工具CC++。它包含数字高级小部件,例如打印对话框和字体对话框(但是,在 Tkinter 8.7 中它开始支持本机font dialog.)

wxWidgets 的亮点之一是它的 GUI 设计器,也WxFormBuilder称为WxWidgets GUI Designer.

Qt

GUI 工具包,例如 Tkinter、...PyQt 和 PySide

从1995年开始,Qt成为最大的应用程序开发框架市场,拥有最大范围和广泛的用户(开发者)。

哦,是的,我想纠正你一件事。作为一个 Qt 用户,我想谈谈 Qt 不仅仅是一个 GUI 工具包,尽管 Qt 最著名的部分是它的 GUI 构建。Qt 是一个应用程序开发框架。在这里,除了 Qt 之外,您可能不需要任何模块来开发应用程序,甚至是超级应用程序。不仅 GUI 及其构建器,Qt CreatorQt 还支持大范围的应用程序开发内容。它支持 Web 引擎、文本编辑器、后端线程、XML 处理,甚至使用 或 OpenCV` 进行 PDF 处理或QImage图像QPixmap转换<QtOpenGL>. You can integrate the Qt with other modules such as

PyQt 和 PySide 都是 C++ Qt 的 Python 绑定。它们都基于名为 的源代码qtbase。不过,差异如下,请参考https://www.pythonguis.com/faq/pyqt5-vs-pyside2/

  • PyQt 使用通用公共许可证版本 2 (GPL2),或者如果您想在商业活动中使用 PyQt 并将其发布给公众,则使用商业许可证。另一方面,PySide 使用较宽松的通用公共许可证版本 3.0 (LGPL3)。

  • 当您调用 时QApplication,PyQt5 或 PyQt6 必须填写字符串列表,通常为sys.argv。然而,PySide 并不要求用户这样做。

  • PyQt 使用PyQt5.QtCore.pyqtSignalpyqtSlot。但是,PySide 使用PySide2.QtCore.SignalSlot。但属性和初始化方法以及装饰器保持不变。

  • 总体而言,PyQt 和 PySide 99.999% 相似。

例子

Tkinter框架中似乎没有表格控件,也Tcl/Tk没有Python tkinter

对于您的示例,它是用QtC++和编写的代码Python

我们的结果:

首先

使用 C++ Qt

#include <QApplication>
#include <QWidget>
#include <QTableWidget>


class MainWindow : public QMainWindow
{
    public:
        MainWindow::MainWindow(QWidget* parent = nullptr)
            : QMainWindow(parent)
        {
            m_tableWidget = new QTableWidget(this);
            m_tableWidget->setRowCount(10);
            m_tableWidget->setColumnCount(5);
            setCentralWidget(m_tableWidget);
        }

    private:
        QTableWidget* m_tableWidget;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

Run Code Online (Sandbox Code Playgroud)

使用Python PyQt/PySide(实际上你可以替换所有内容,但将PyQt5更改为PySide2

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.__table_widget = QTableWidget(self)
        self.__table_widget.setRowCount(10)
        self.__table_widget.setColumnCount(5)
        self.setCentralWidget(self.__table_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())

Run Code Online (Sandbox Code Playgroud)