我的第一个PyQt5程序(转载于–学点编程吧)

今天我们就用PyQt5编写一个最基本的windows窗口。

先将代码展示如下,然后我们细细讲解。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':

    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(500, 300)
    w.move(300, 300)
    w.setWindowTitle('我的第一个PyQt5小程序')
    w.show()

    sys.exit(app.exec_())

执行的结果如下图:

python窗口程序 python怎么做窗口程序_PyQt5

import sys
from PyQt5.QtWidgets import QApplication, QWidget

这段代码表明我们引入了python的相关模块,这就包括了sys模块,以及PyQt5中的QtWidgets模块。QtWidgets模块包含了一整套UI元素组件,用于建立符合系统风格的classic界面,非常方便。同时为了更方便的使用我们还明确了使用QtWidgets模块中的QApplication, QWidget。

if __name__ == '__main__':

这个属于Python基础知识,如果写了这句话并将执行的语句放到这个判断语句的后面,那么只有在程序本身被执行的时候才能运行这个判断语句下面的语句。否则程序被作为模块导入的时候就会执行。

app = QApplication(sys.argv)

每个PyQt5应用程序必须创建一个应用程序对象。 sys.argv参数是来自命令行的参数列表。 Python脚本可以从shell运行。 写了这句话就能让我们的程序从命令行启动。

w = QWidget()

QWidget小部件是PyQt5中所有用户界面对象的基类。 我们提供了QWidget的默认构造函数。 默认构造函数没有父类。 没有父类口小部件称为窗口。、

w.resize(500, 300)

resize()方法调整窗口小部件的大小。这里我们设定窗口的大小:宽500像素,高300像素。

w.move(300, 300)

move()方法将小部件移动到屏幕上x = 300,y = 300坐标处的位置。这里我们来看一下屏幕坐标是怎么设定的,来看看下图。

python窗口程序 python怎么做窗口程序_应用程序_02


通过上图我们可以知晓,坐标原点是从哪里开始计算的,我们要是将程序中的(300,300)这个坐标改成(0,0),窗口就会跑到左上角去了,大家可以试试。

w.setWindowTitle('我的第一个PyQt5小程序')

这个方法顾名思义,就是设置窗口的标题。

w.show()

show()方法在屏幕上显示窗口小部件。 一个小部件首先在内存中创建,然后在屏幕上显示。

sys.exit(app.exec_())

最后,我们进入应用程序的主循环(main loop)。 事件处理从这一点开始。 主循环(main loop)从窗口系统接收事件并将它们分派到应用程序小部件。 如果我们调用exit()方法或者主窗口小部件被破坏,那么主循环(main loop)就会结束。

sys.exit()方法确保一个干净的退出。

exec_()方法有一个下划线。 这是因为exec是一个Python关键字。 因此,使用exec_()。

例如:

>>> exec('print(1+1)')
2

注意:为了便于初学者理解,我们把主循环(main loop)简单的谈一下。GUI应用程序都是事件驱动的。比如键盘事件、鼠标事件等等。还有一些事件来自于系统内部,比如定时事件、其它文件事件等等。在没有任何事件的情况下,应用程序处于睡眠状态。这种事件驱动机制,GUI应用程序都需要一个主循环(main loop)。主循环(main loop)控制应用程序什么时候进入睡眠状态,什么时候被唤醒。所以主循环(main loop)就是干这个的。

我们再举一个例子,结合命令行方式,自定义窗口标题。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':

    app = QApplication(sys.argv)    
    try:
        if len(sys.argv) < 2:
            raise ValueError
        else:
            title = " ".join(sys.argv[1:])
    except ValueError:
        title = "我的界面"

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle(title)
    w.show()

    sys.exit(app.exec_())

总体看没有什么变化,就是多了一个try…except…的语句,通过这个语句我们实现了:命令行中如果带入参数,窗口的标题就用这个参数代替,否则用默认的“我的界面”作为窗口的标题。当输入多个参数时,则合并这些参数为一个。

执行结果:

python窗口程序 python怎么做窗口程序_父类_03


接下来呢,我们把这个窗口美化一下,增加一个图标。当然写法上调整一下,上面的代码基本上是按照面向过程来写的,下面开始我们采用面向对象的方式进行编码。

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon


class Icon(QWidget):

     def __init__(self):
        super().__init__()
        self.init_ui()

     def init_ui(self):
        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('我的界面+草莓')
        self.setWindowIcon(QIcon('草莓.png'))

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Icon()
    sys.exit(app.exec_())

执行结果:

python窗口程序 python怎么做窗口程序_应用程序_04


我们可以看到窗口已经换成我们了一个草莓的图标。(矢量图标可以去阿里巴巴矢量图标库下载)

下面我们对新出现的代码进行相应的解析。

from PyQt5.QtGui import QIcon

从PyQt5.QtGui中引入QIcon这个类,也是为了便于图标的设定。

class Icon(QWidget):

    def __init__(self):
        super().__init__()

        self.init_ui()

很明显,我这里继承了QWidget这个基类,并自定义了一个名为Ico的新类。同时对这个Icon的新类进行了初始化。当子类继承父类的时候,我们继承了父类的方法。子类中含有__init__时,不会自动调用父类__init__,如需使用父类__init__中的变量,则需要在子类__init__中显式调用。

其实就是一点,我们要用QWidget中__init__的变量,就必须在子类Icon中显示调用:super().init()。__init __()方法是Python语言的初始化方法(构造函数)

self.init_ui()

程序的GUI界面用initUI()函数创建。

self.setGeometry(300, 300, 400, 300)
self.setWindowTitle('我的界面+草莓')
self.setWindowIcon(QIcon('草莓.png'))

上面的三种方法都是从QWidget类中继承的。 setGeometry()做了两件事情:它在屏幕上定位窗口并设置它的大小;前两个参数是窗口的x和y位置;第三个是宽度;第四个是窗口的高度。实际上,它在一个方法中组合了resize()和move()方法。 最后一个方法设置应用程序图标。 为此,我们创建了一个QIcon对象。 QIcon接收到我们要显示的图标的路径(和当前程序在同一个目录下)。

接下我们再这个窗口增加一个关闭按钮并实现关闭窗口的功能。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QCoreApplication

class Icon(QWidget):

    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):

        self.setGeometry(300, 300, 400, 300)
        self.setWindowTitle('我的界面+草莓')
        self.setWindowIcon(QIcon('草莓.png'))

        btn = QPushButton('退出', self)
        btn.clicked.connect(QCoreApplication.instance().quit)
        btn.resize(70,30)
        btn.move(50, 50)

        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Icon()
    sys.exit(app.exec_())

执行结果如下:

python窗口程序 python怎么做窗口程序_PyQt5_05


我们来解析一下代码。

from PyQt5.QtWidgets import QPushButton
from PyQt5.QtCore import QCoreApplication

因为需要增加按钮,所以我们引入了QPushButton类。同时我们还需要一个来自QtCore模块的对象。

btn = QPushButton('Quit', self)

我们创建一个按钮。该按钮是QPushButton类的一个实例。构造函数的第一个参数是按钮的标签。第二个参数是父窗口小部件。父窗口小部件是示例窗口小部件,它是通过QWidget继承的。

btn.clicked.connect(QCoreApplication.instance().quit)

PyQt5中的事件处理系统采用信号和槽机制构建。 如果我们点击按钮,点击的信号被发出。 槽可以是Qt槽函数或任何Python可调用的函数。 QCoreApplication包含主事件循环; 它处理和调度所有事件。 instance()方法给我们当前的实例。
请注意,QCoreApplication是通过QApplication创建的。 点击的信号连接到终止应用程序的quit()方法。

通信在两个对象之间完成:发送方和接收方。 发送方是按钮,接收者是应用对象。

简单的来说就是按钮发出被单击的信号,连接到退出程序的方法。