# Python GUI初步认识与C/S端发展之我见

> 作者：zning（https://ning.ae） · 发布：2021/09/07 18:29 下午 (UTC+8) · 原文：https://zning.me/16310105700119.html

今天翻了翻《Python编程（第四版）》，这本书其实买来还是有点久的，毕竟现在Python 3.9都出来了，这书是Python 3.1/3.2 Beta的示例。当然也暴露了我这书买来没怎么翻过的事实。（狗头）

其实翻书本来是想看看有没有写关于Python类的装饰符相关的东西，结果翻了下目录好像并没有。不过我发现了一个在Python世界一直没有关注过的东西：GUI。

其实对于我这个B/S死忠粉来说，对于C/S的应用几乎没有怎么编程经验，也就没怎么接触过GUI这块，无论是大学期间Java程序设计这门课讲GUI还是C# .net课上的GUI，相关的课程作业和实验设计我都是有点头疼的，emmmm 可能也跟我一直从事B/S相关事情有关系吧。

今天吸引来，主要是因为想了解下Python GUI比起Java和C#，有没有什么特点。

先说结论：Python自带GUI框架，能用；几行代码开个窗口，方便。果然人生苦短，我用Python。（狗头）

Python GUI框架主要有tkinter、wxPython、PyQt、PythonCard、Dabo等，而Python自带的是thinkter。简单的窗口启动代码如下：

```py
from tkinter import *

Label(text="啥玩意").pack()
mainloop()
```

运行后如图：

![image-20210907160117089](media/16310105700119/image-20210907160117089.png)

咋说呢，三行代码起一个GUI，这是我第一个接触到的能干这个事儿的语言（当然时过境迁，现在估计有很多现代化语言都可以干这个事儿了，知道的大佬可以在评论区留言）。

再来点元素：

```python
from tkinter import *
from tkinter.messagebox import showinfo

def reply():
    showinfo(title="恋爱循环", message="按钮按下去啦！")

window = Tk()
button = Button(window, text="快来点击", command=reply)
button.pack()
Label(text="啥玩意").pack()
window.mainloop()
```

运行后如图：

![image-20210907160305056](media/16310105700119/image-20210907160305056.png)

好！很好！很有精神！不算空行才9行代码，把Java需要写十几行实现的功能给搞定了。

Python GUI的面向对象写法以及窗口嵌套：

类定义文件`TestGUI.py`：

```python
from tkinter import *
from tkinter.messagebox import showinfo

class TestGUI(Frame):
    def __init__(self, parent=None):
        Frame.__init__(self, parent)
        button = Button(self, text='按下去', command=self.reply)
        button.pack()

    def reply(self):
        showinfo(title="恋爱循环2", message="でも そんなんじゃ だーめ")
```

调用文件`bindgui.py`：

```python
from tkinter import *
from TestGUI import TestGUI

main = Tk()
Label(main, text=__name__).pack()

popup = Toplevel()
Label(popup, text="绑定").pack(side=LEFT)
TestGUI(popup).pack(side=RIGHT)
main.mainloop()
```

运行后如图：

![image-20210907161408238](media/16310105700119/image-20210907161408238.png)

好了，Hello World就写到这了，我也不做代码讲解了。想多说下自己对于C/S端当下发展的理解。

其实很长一段时间我一直觉得在移动互联网的蓬勃发展，B/S端将逐步取代C/S端，一方面是因为越来越多的人用手机而不是PC，另一方面由于Web技术的进步，Web在全平台适配上已经不是什么难事，因此当初我认为C/S终将会走向没落，而B/S终究会成为最为重要的程序开发方式。

当然直到现在，我觉得我的判断还是对了一半的：B/S端确实成为了最为重要的程序开发方式，即使是App开发，使用Native开发的也要少于用WebView的。但是我失算的一点是，C/S端并没有走向没落，相反人家还活得好好的。究其原因我认为当时的判断忽略了两点：一是物联网IoT相关领域的发展，二是传统行业对于GUI软件的需求。

众所周知，近几年IoT其实发展的还是可以的，尤其是工业互联网和智能家居领域的相关技术发展，而这些数字化系统必不可少的需要配置相关的软件去操控这些物理设备，需要在系统启动后就能直接打开软件并进入相关界面，这个时候使用B/S其实并不是特别合适，因为毕竟浏览器这种方式还需要访问网址之类的东西。当然随着目前的发展，有些操控版已经换成了基于Android开发的App了，这种的倒是可以解决这个问题。

另外就是传统行业一些需求，其实并不是说他们的业务不适合B/S开发，而是技术债积累过多，对于系统的重构成本可能不太合算，这样的话反而使用C/S端更容易一些。而且据我所知C#的.net窗口开发在画界面方面是可以直接拖拽的，所以C/S编程相关的职位其实要求不是那么高，而换了B/S之后所有架构都要重新评估，引入了技术复杂度，对于一个非互联网的传统企业来说，IT本身就属于成本部门或稳定部门而不是利润来源部门，必然唯恐避之不及。这种客观存在的情况也是C/S一直存在的必要之一，当然相比第一个的增量，这一个仅仅是一个存量，并不能阻挡大势。

这就让我想起当年互联网兴起的时候，有人宣称书籍将会消亡，而再往前电视出现之后，有人也宣称过广播会消亡。虽然我们都知道事物都是螺旋上升的，旧事物会消亡，但是这个真正的“旧”的道理，是站在对人是否有用、有利、能可持续发展的角度来看的。书籍和广播固然是传统的，但他仍然是人们获取知识、交流思想和传输知识的有益渠道，只要这个作用没有消失，他们也不会消失，即使他们从历史的角度来说，确实是“旧”的。

拿过这样的思想，再来看待当下科技互联网的发展，其实所有的主流语言、开发模式、软件工程方式方法，都是这样的道理，只不过是你方唱罢我登场。The wheel turns, nothing is ever new.
