Tkinter vs wxPython - Python图形用户界面库的比较

1,299 阅读6分钟

在这篇 "Tkinter vs wxPython "的文章中,我们将比较Python中两个流行的GUI库,以决定胜负。通过这篇文章,我们将试图强调使用这两个库的优缺点,并分享一些代码片段来帮助你决定你应该学习哪一个。


目录

  • Tkinter
  • wxPython
  • 社区
  • 代码比较
  • 总结

Tkinter

作为Python的标准事实GUI库,我们先来谈谈Tkinter

优势

Tkinter是最古老的GUI库之一,这使得它积累了大量的用户群,最终导致它被添加到标准Python库中。这使得它不需要任何额外的安装或下载包的好处。它也是一个非常成熟和稳定的库,所以你不可能遇到任何问题。

Tkinter的主要优点可以用一句话来概括。它简单、快速、易学。这三点是Tkinter受欢迎的主要原因,尽管有一些缺点,我们后面会讲到。

其他一些不太被提及的优点,但也很重要,那就是Tkinter的(事件)绑定系统和它的布局管理。绑定系统非常灵活且易于集成,允许你做一些事情,比如在鼠标悬停或按键时触发功能。

同样地,Tkinter的布局系统也非常直观,并且很容易使用三个布局管理器之一进行设置,即pack()、place()或grid()。你可能会发现Tkinter的布局和绑定系统比wxPython更加强大和容易使用。

缺点

毋庸置疑,它有一个非常 "经典 "的外观,在合适的人手中可以用来创建专业的应用程序。然而,它的开箱即用的外观几乎被其他所有的GUI库比下去了,如ax wxPython和PyQt。

Tkinter的另一个缺点是它的小工具。虽然它们很简单,使用起来也很直观,但它们的外观明显过时了。此外,其他库如PyQt和wxPython有更强大和先进的部件,如PyQt的视频播放器。(Tkinter在基本部件方面与之匹配得很好,但在高级部件方面就不行了)

ttk

如果没有ttk子模块,Tkinter的缺点可能会说服许多人转而使用另一个GUI库。然而,ttk 通过引入主题和新的样式选项,以及许多部件的更新外观,帮助缓解了这一问题。

下面是一些默认的tkinter部件的外观。

下面是同样的东西,但用ttk版本的小工具代替。

正如你所看到的,较低的那个看起来更整洁,更现代。还有一些特殊的效果,比如当你把鼠标悬停在按钮上时(会给它一个蓝色的亮点),这在默认的Tkinter中是不存在的。

另外,请注意,ttk是 不是一个单独的库或包,需要单独下载。它包含在tkinter库中,可以很容易地被导入。你可以在这个ttk教程系列中了解更多关于ttk和它的部件的信息


wxPython

而对于wxPython,它是wxWidgets库的一个Python扩展。

优势

wxPython的主要优势和卖点在于它有大量功能丰富的widgets,以及良好的设计和外观。这些也是它相对于Tkinter库的主要优势,Tkinter库看起来有点过时。另一个优点是,wxPython开箱即用,在所有平台上看起来都很好,而且不需要任何定制的修补。

它的学习曲线可能比Tkinter更陡峭,但一旦你掌握了它的工作原理,你就可以获得比Tkinter更多的特性和功能。

那些对更原生的windows外观感兴趣的人将会喜欢wxPython,因为它类似于原生的Windows GUI。

wxPython vs Tkinter - Menus

用Python创建强大的菜单

菜单部件是一个很好的例子,wxPython内置了对菜单图标、键盘快捷键和方便的菜单项部件的支持,比如你在上图中看到的check-button-menu。

劣势

首先,我想说的是,wxPython需要单独下载(幸运的是,使用pip的过程很简单)。当你把你的应用程序分发给其他用户时,这一点可能很重要。否则,如果只是个人问题,这几乎是一个可以忽略不计的问题。

wxPython的另一个 "缺点 "是它比Tkinter慢一些,尽管这在最初加载窗口显示的时候有点难以衡量。

另一个小问题是,wxPython仍在积极开发中,不过这在某种意义上也对它有利。它还没有达到像Tkinter那样的稳定性和成熟度,但是它的积极开发有可能带来一些新的功能,这些功能可以使wxPython的天平倾向于后者。

我们已经在Tkinter部分讨论了一些Tkinter胜过wxPython的地方,所以我们不要再提这个了。然而,如果我们从中立的角度来看待wxPython,其实并没有什么明显的缺点(除了速度问题)。


社区

在我们进入代码比较之前,让我们简单地谈谈社区。社区是相当重要的,它决定了一个库的寿命,以及学习该库所需的努力程度。

我在学习wxPython时遇到的一个小问题是,在文档之外缺乏在线教程和资源。许多出现在google首页的wxPython教程都是十年前的,而且没有更新到符合最新的wxPython版本(凤凰)。这也有一部分原因是wxPython仍在积极开发中。不过文档还是不错的,所以这也弥补了它的不足。

另一方面,Tkinter有大量的社区支持,你可以在网上找到几十个最新的指南。Tkinter在Python标准库中的受欢迎程度可见一斑。

简而言之,在社区方面,Tkinter比wxPython更胜一筹。


代码比较

为了方便起见,让我们看一下这两个库的一些代码,以便你能感觉到它们的语法。

这只是一个简单的例子,我们创建了一个链接到函数的单一按钮。这些例子应该向你展示了在wxPython/Tkinter中设置一个窗口和一个简单的widget所需要的基本代码。

首先,我们有Tkinter。

import tkinter as tk

class Window:
    def __init__(self, master):
        self.master = master
        frame = tk.Frame(self.master)
        
        button = tk.Button(frame, text = "Close Window", command = self.quit)
        button.pack(pady = 30)

        frame.pack()

    def quit(self):
        self.master.destroy()

root = tk.Tk()
root.geometry('200x150')
window = Window(root)
root.mainloop()


这里是wxPython的版本。

import wx
 
class Window(wx.Frame):
    def __init__(self, title):
        super().__init__(parent = None, title = title)
        panel = wx.Panel(self)
 
        closeButton = wx.Button(panel, label = "Close", pos = (50,50), size = (100,30))
        closeButton.Bind(wx.EVT_BUTTON, self.closeWindow)
 
        self.Centre() 
        self.Show()
 
    def closeWindow(self, e):
        wx.CallAfter(self.Close)
         
         
app = wx.App()
window = Window("WxPython Button Tutorial")
app.MainLoop()

wxPython vs Tkinter - Code Comparision

(默认的wxPython窗口尺寸相当大,因此看起来是这样的,不要惊慌)


总结

如果我可以用一句话来总结的话,我很想说,Tkinter的设计更好,更容易使用,但wxPython的功能更丰富,更强大,看起来也更漂亮。我个人认为这句话准确地抓住了两者的主要区别。

只要记住,两者都是伟大的库,都是用来制作强大的GUI应用程序的。最后,更重要的是你自己在利用库的功能方面的技能。