之前学习Python基础语法时在小作业中使用过tkinter,实现过一个GUI小程序,当时对Python GUI编程的思路没有什么理解,只是看了几个例子、调用了几个简单的控件实现了一些基本的内容。

几个星期前想写一个自己使用的GUI程序,写了一点代码之后发现自己已经把上次tkinter库编程经历中学过的东西忘记了,而且也记得那次编程过程很难受——自己想要的控件很难实现,即使勉强实现,界面也不太美观、使用起来很不方便。

由于上述总总原因,决定稍微认真的学一点PyQt5,把过程做一点记录,以后使用Python写程序也能更方便。


文章目录

        • 创建一个简单窗口
        • 换一种编程风格
            • super().__init__()的作用
            • 使用面向对象的风格重写代码
        • 需要掌握的代码附录

创建一个简单窗口

import sys
from PyQt5.QtWidgets import QApplication,QWidget

if __name__ == '__main__':
	app = QApplication(sys.argv)

	w = QWidget()
	
	w.resize(700,800)
	w.move(0,0)
	w.setWindowTitle('new window')

	w.show()

	sys.exit(app.exec_())

运行效果如下:

我们对这段代码做一些解释:

  • QApplication():此函数用于处理QWidget的初始化与收尾工作,其参数为sys.argv。
  • sys.argv:此参数是一个列表,列表中的第一个元素是程序本身,后续元素是外部给予的参数。我们可以尝试将其print出来,在我们的这段程序中其结果是['工作台2.py']
  • QWidget:PyQt5中GUI编程的基类,是其它窗口和控件的父类。
  • resize():方法:用于调整窗口大小。
  • move():方法:用于设置窗口初始位置。
  • setWindowTitle():方法:用于设置窗口标题。
  • show():方法:用于展示窗口。
  • sys.exit(app.exec_()):app.exec_()的作用是运行主循环、进行事件处理并在关闭窗口后将状态代码返回;而sys.exit()则将应用程序退出并返回n到父进程,其用法是sys.exit(n)。

换一种编程风格

在上一个例子中我们使用了简单的面向过程编程,现在我们使用另一种编程风格——面向对象来实现上述窗口,并使用一些新方法。


super().init()的作用

在下面的例子中我们要使用一行代码:super().__init__()。这里我们先看看这行代码的作用:

我们先写一个简单的类:

class Person(object):
	'父类'

	def __init__(self,age=20):
		self.age = age

	def howOld(self):
		print(self.age)

将其实例化并使用相关方法:

He = Person()
He.howOld()

结果是20

我们再写一个新类,使其继承我们的上一个类:

class LiHua(Person):
	'子类'

	def __init__(self):
		self.name = 'LiHua'

	def whatIsYourName(self):
		print(self.name)

实例化并使用相关方法:

lihua = LiHua()
lihua.whatIsYourName()

结果是LiHua

但是,当我们想使用父类中的方法lihua.howOld()时,程序的Traceback告诉我们AttributeError: 'LiHua' object has no attribute 'age',也就是说我们无法直接使用父类的属性——因为我们并没有对父类进行初始化。而这行代码super().__init__()的作用就是先对父类进行一遍初始化。

所以,我们只需要在对子类进行初始化时加上一句super().__init__(),程序就可以完整运行了。

完整代码如下:

class Person(object):
	'父类'

	def __init__(self,age=20):
		self.age = age

	def howOld(self):
		print(self.age)

He = Person()
He.howOld()

class LiHua(Person):
	'子类'

	def __init__(self):
		super().__init__()
		self.name = 'LiHua'

	def whatIsYourName(self):
		print(self.name)

lihua = LiHua()
lihua.whatIsYourName()
lihua.howOld()
使用面向对象的风格重写代码
import sys
from PyQt5.QtWidgets import QWidget,QApplication
from PyQt5.QtGui import QIcon

class Window(QWidget):
	'继承父类QWidget'

	def __init__(self):
		super().__init__()
		#对父类QWidget进行初始化
		
		self.setWindow()

	def setWindow(self):
		'方法:对窗口进行初始化设置'
		self.move(0,0)
		self.resize(500,500)
		self.setWindowIcon(QIcon('WindowIcon.jpg'))
		self.show()

if __name__ == '__main__':
	app = QApplication(sys.argv)
	w = Window()
	sys.exit(app.exec_())

在这段代码的前面,我们import了一个新模块:QIcon;这个模块为我们提供了修改窗口图表的方法,我们只需要提供图标对应图片的地址即可。

我们定义了一个Window类,此类继承了QWidget,并将QWidget类中的一些方法打包成了一个总的方法,我们只需要在初始化的时候调用该方法即可;在这些被打包的方法中,self.setWindowIcon(QIcon('WindowIcon.jpg'))这行代码的目的就是修改窗口图表,具体效果如图:

可以看到,窗口左上角标题栏中显示的图表从默认图片变成了我们自己指定的图片。

在后续代码中,我们使用了QApplication函数、将继承自QWidget的Window类实例化,最后进行循环并指定了退出。

可以看到,使用面向对象风格的编程所写的代码更加简洁,也更符合PyQt5自身的编程风格。


需要掌握的代码附录

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

class Window(QWidget):
    '对窗口进行一些初始化设置的类,继承自QWidget'

    def __init__(self):
        '初始化:对父类进行初始化并调用子类方法'

        super().__init__()

        self.setMyWindow()
        
        pass

    def setMyWindow(self):
        '方法:对窗口进行一些初始设置'

        self.setWindowIcon(QIcon('my_window_icon.jpg'))
        self.resize(500,700)
        self.move(0,0)
        self.show()

        pass


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Window()
    sys.exit(app.exec_())

这段代码产生了一个可以关闭的、最简单的窗口,效果如下:

更多推荐

自学PyQt5(一)|用两种编程风格创建一个基础窗口