所有后面讲解和记录的源码都会在 GuiHub中,可以自行下载
输入做加法
今天我们做一个简单的输入做加法的一个界面,涉及内容:
1、输入框
2、按钮事件
3、框内容获取和修改
UI布局
首先按照第二讲的说法,拖出一个和我一样的界面,功能实现就是A+B=C,左边两个输入框和输出框是Line Edit控件,然后最右边是一个按键Push Button按钮。
在属性界面找到三个框和按钮的objectName,分别命名A\B\C和Calculate
首先布局界面,然后按照上一讲的方法,进行显示,但是你发现你按计算按钮没有任何反应,这就要讲到下一个知识点,按钮点击事件。
按钮事件
实现A+B之前,我们先熟悉按钮点击事件,我们先再拖两个按钮,命名可以不管,显示文字改为显示和隐藏。如下图
然后找到菜单栏,找到添加槽和信号按钮。
然后鼠标点显示不要放,鼠标移动到B输入框会出现以下界面,简单理解就是显示按钮的什么信号会触发B输入框的什么动作。
这边左下角的勾打上,然后左边表示按钮显示出发了什么信号,我们选择点击信号,右边表示需要连接到什么动作,我们选择B框的show(),表示B框的显示。隐藏按钮同理,左边选择点击信号,右边选择hide(),表示隐藏。
然后保存,转码后,运行main.py,显示状态如下,效果是不是很明显。
那么我们现在回到刚刚的加法,计算按钮上,由于我们使用的是A+B算法,所以我们这个触发的动作需要自己写,因此在连接信号和槽框中,信号直接拉出来放在空白处,然后出来的槽动作那边点编辑
在出来的弹窗中点击+,添加槽函数,输入CalculateClick()。相当于一旦我点击计算按钮,我就会调用这个函数的意思。
然后对应的选择好之后,点击OK,保存UI,并用PyUIC进行转码
然后我们打开UI.py,我们会发现这个函数,意思就是我们按钮的点击链接到了Calculate函数。然后我们需要在主函数中重写这个函数。因为我们本身UI不带这个函数
这边我们需要对UI界面类进行重写,在主函数中添加以下代码:
class Mywindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(Mywindow, self).__init__()
self.setupUi(self)
def CalculateClcik(self):
print("触发按钮。")
这边设计到几个点
1、类的继承
语法:class 派生类名(基类名)
那么我们的写法就是我们申请了一个Mywindow类,这个类继承了QtWidgets.QMainWindow,和Ui_MainWindow两个类的方法。
2、init函数
这是一个初始化函数,默认类实例化之后,就会自动调用init函数。有什么需要初始化的,就在这边完成。
3、def :
这是函数的什么指示。
4、self代表类的实例,而非类
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
程序中写的def CalculateClcik(self),表示我们重写CalculateClcik()函数,我们这边先输出打印“触发按钮”,实际效果是这样的:
按钮触发的函数也写好了,现在我们可以做我们的加法了。
做加法,我们首先得获取出A和B里面的内容,首先我们需要将字符串转为数字就是‘123’转为数字的123
这边用到int函数,这是比较方便的函数
int(self.A.text())
这句话什么意思呢,就是把A输入框里面的字符串转为整形。当然浮点型大家可以自行深入。
那么最后CalculateClcik函数就写成了这样:
def CalculateClcik(self):
# print("触发按钮。")
self.C.setText(str(int(self.B.text()) + int(self.A.text())))
self表示实例本身,这边可以认为是界面自生,self.C表示界面中的C控件。其中setText是设置框内的内容。直接text()则是取里面的内容。
main.py代码:
# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from calculate import Ui_MainWindow
from PyQt5 import QtWidgets
class Mywindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(Mywindow, self).__init__()
self.setupUi(self)
def CalculateClcik(self):
# print("触发按钮。")
self.C.setText(str(int(self.B.text()) + int(self.A.text())))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Mywindow()
window.show()
sys.exit(app.exec_())
效果:
当然这边还需要做一些保护,比如A框输入英文,那么程序运行是会崩溃的。这边就需要用到try函数,
def CalculateClcik(self):
try:
self.C.setText(str(int(self.B.text()) + int(self.A.text())))
except:
print('请输入正确的整数')
这边的意思就是,如果try里面的代码运行不成功,就输出下面的打印
具体效果
好了,以下是最终代码:
# ! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from calculate import Ui_MainWindow
from PyQt5 import QtWidgets
class Mywindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(Mywindow, self).__init__()
self.setupUi(self)
def CalculateClcik(self):
try:
self.C.setText(str(int(self.B.text()) + int(self.A.text())))
except:
print('请输入正确的整数')
self.C.setText("")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Mywindow()
window.show()
sys.exit(app.exec_())