20.2 让 GUI 做点事情

    现在有了一个非常基本的 GUI,这个窗口中包含一个按钮。不过它什么也做不了。我们还没有编写代码来告诉程序当有人点击按钮时要做些什么。这就像有一辆汽车,虽然有车身和四个轮子,但是没有发动机。尽管看起来不错,可是哪里也去不了。

    空标题文档 - 图1

    我们需要一些代码让程序运行起来。对于 PyQt 程序来说,起码要有下面这些代码:

    代码清单 20-1 PyQt 程序所需的最少代码

    空标题文档 - 图2

    如果你想知道在第空标题文档 - 图3行结尾处的 [0] 的作用,右侧是关于它的解释。

    在加载 UI 的那行代码结尾处添加 [0],是因为 uic.loadUiType() 方法返回的是一个列表,其中包含两个东西:一个是 form_class,另一个是 base_class。我们只需要第一个,即 form_class,也就是列表中的 item[0]。

    由 Python 就可以想见,PyQt 中的一切都是对象。每个窗口都是对象,要用 class 关键字定义。在这个程序以及所有我们要用 PyQt 编写的所有程序中,都有一个类继承自 PyQt 的 QMainWindow 类。在代码清单 20-1 中,我们调用了 MyWindowClass 类(第 6 行),但其实这个类可以用任意名字。需要记住的是,类的定义只是一个蓝本,我们仍然需要根据蓝本去把程序构建出来,即创建一个类的实例(instance)。我们是通过接近结尾处的 myWindow = MyWindowClass() 来创建实例的。myWindowMyWindowClass 类的一个实例。

    把上面的代码键入到 IDLE 或 SPE 编辑器窗口中,保存为 MyFirstGui.py。

    • 主代码:MyFirstGui.py

    • UI 文件:MyFirstGui.ui

    这两个文件还要保存在同一个位置上,这样主程序才能找到 UI 文件并在程序启动时加载。

    现在可以从 SPE 或 IDLE 运行这个程序。你会看到窗口打开,可以点击按钮,不过什么都不会发生。我们已经让程序运行起来,但是还没有为按钮编写任何代码。现在点击标题栏中的 ×,关闭这个程序。

    下面来完成一个简单的任务。点击按钮时,让它移动到窗口中的一个新位置。增加代码清单 20-2 中的第 10 行到第 7 行代码。

    代码清单 20-2 为 Hello 按钮增加一个事件处理器

    空标题文档 - 图4

    一定要让整个 def 块比 class 语句多缩进 4 个空格,如代码清单所示。为什么要这么做?这是因为所有组件都在窗口中,也就是说要作为窗口的一部分。所以按钮事件处理器的代码应该放在这个类定义内。

    试着运行这个代码,看看会发生什么。下一节将详细分析这个代码。