您的位置:首页 > 编程语言 > Python开发

Python学习 Python3.5+PyQt5环境--------02、代码与界面GUI分离

2017-06-08 15:32 846 查看
以GUI_ClearText.py为例,GUI_ClearText.py的源代码是界面和业务代码在一起的。

思路:

把原代码拆分为三个部分,分别实现窗口布局布局、业务实现、主程序调用功能:

一、窗口布局文件:GUI_ClearTextSeparateUi.py

二、业务实现文件:GUI_ClearTextSeparateBusi.py
三、主调用文件:GUI_ClearTextSeparateMain.py

详解:

一、窗口布局文件:GUI_ClearTextSeparateUi.py

1、创建Ui类,创建一个setupUi()方法,布局窗口布局。修改自GUI_ClearText.py里的类Ui_Dialog。

# PyQt5 Designer 生成的代码

# 表示导入相关资源库
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui(object):														# 定义一个GUI类,名称为 “Ui_Dialog” ,继承自 “object”,不是窗体不能直接调用

def setupUi(self, Dialog):											# 定义方法“setupUi”,这个方法创建窗口,窗口名称为“Dialog”;布局相关窗口部件
Dialog.setObjectName("Dialog")									# 设置窗口名称为“Dialog”,源自方法setupUi的必选参数
Dialog.resize(400, 300)											# 设置窗口大小
self.label = QtWidgets.QLabel(Dialog)							# 创建一个标签,并将标签加入到窗口Dialog中
self.label.setGeometry(QtCore.QRect(21, 100, 91, 20))			# 设置标签的大小和位置
self.label.setObjectName("label")								# 设置标签的名称(指被引用的名称,而不是标签上显示的名称)

# 以下类似的,设置输入框及按钮的相关信息
self.lineEdit = QtWidgets.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(150, 100, 113, 22))
self.lineEdit.setObjectName("lineEdit")
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(170, 190, 97, 29))
self.pushButton.setObjectName("pushButton")


二、业务实现文件:GUI_ClearTextSeparateBusi.py

1、首先导入界面文件里的Ui类

from GUI_ClearTextSeparateUi import Ui

2、创建Busi类,继承自Ui,主调用程序里需要使用Ui类的setupUi()方法

3、创建Busi类的方法setupBusi()方法,实现业务(信号和槽的连接),以及定义相关部件显示出来的文字

from PyQt5 import QtCore, QtGui, QtWidgets
from GUI_ClearTextSeparateUi import Ui									# 导入来自文件GUI_ClearTextSeparateUi.py 里的名称为 Ui 的类,这个类实现窗口部件布局。

# 创建Ui的子类Busi,自动继承Ui的 setupUi 方法,这里定义实现业务的方法
class Busi(Ui):
def setupBusi(self, Dialog):

# 下面是该类的一些具体动作
self.retranslateUi(Dialog)										# 调用自定义的方法“retranslateUi”(详细内容见下面),参数是窗口名称,作用是修改相关窗口部件的显示名称
self.pushButton.clicked.connect(self.lineEdit.clear)			# 按钮的单击动作 连接到 文本框的清除动作:前面是信号signal,后面是槽slot
QtCore.QMetaObject.connectSlotsByName(Dialog)					# 关联信号槽,其作用是如其名称一样,用来将de>de>Dialog里的子孙de>de>Dialog的某些信号按照其objectName连接到相应的槽上,如 button_hello.setObjectName("hello_button")

# 定义方法“retranslateUi”,以下代码是PyQt5自动生成的,作用是修改相关窗口部件显示的名称
def retranslateUi(self, Dialog):									# 传入参数是窗体名称,修改相关窗口部件对外显示的名称
_translate = QtCore.QCoreApplication.translate					# 此句似乎没有必要:下面应该可以直接定义窗口部件所显示的名称。待进一步了解

Dialog.setWindowTitle(_translate("Dialog", "Dialog"))			# 设置名称为“Dialog”的窗体(前一个“Dialog”)显示的标题名字为“Dialog”(后一个“Dialog”)
# Dialog.setWindowTitle( "Dialogwwwww")							# 测试语句,和上句效果没有区别
# print(_translate("Dialogs", "Dialogaaa"))						# 测试语句,_translate似乎是一个字符串截取功能,但是说明手册中又说前一个字符串一般是一个类名称

self.label.setText(_translate("Dialog", "Enter Text"))			# 设置标签的显示文字为“Enter Text”
self.pushButton.setText(_translate("Dialog", "Clear"))			# 设置按钮的显示文字为“Clear”


三、主调用文件:GUI_ClearTextSep
4000
arateMain.py

1、生成一个QWidget(窗口)对象来重载我们设计的Busi类,达到显示目的。

           widget=QtWidgets.QWidget()

2、实例化Busi类,
            mywindow=Busi() 

3、运行建立界面方法

           mywindow.setupUi(widget)

4、运行建立业务方法

           mywindow.setupBusi(widget)

from PyQt5 import QtCore, QtGui, QtWidgets
from GUI_ClearTextSeparateBusi import Busi								# 导入来自文件GUI_ClearTextSeparateBusi.py 里的名称为 Busi 的类,这个类实现业务要求。

import sys

if __name__=="__main__":

app=QtWidgets.QApplication(sys.argv)  							# 实例化QApplication类,作为GUI主程序入口,需要import sys,可紧放在这句之前,也可放在代码最前面部分
widget=QtWidgets.QWidget()  									# 因为Qt Designer默认继承的object类,不提供show()显示方法,所以我们生成一个QWidget(窗口)对象来重载我们设计的Ui_Dialog类,达到显示效果。
mywindow=Busi()  												# 实例化之前定义的窗口类
mywindow.setupUi(widget)  										# 设置布局Ui,布局的对象是刚才生成的widget(窗口)
mywindow.setupBusi(widget)										# 设置业务
widget.show()  													# 使用 show() 方法
sys.exit(app.exec_())  											# 当来自操作系统的分发事件指派调用窗口时,应用程序开启主循环(mainloop)过程,当窗口创建完成,需要结束主循环过程,这时候呼叫sys.exit()方法来,结束主循环过程退出,并且释放内存。为什么用app.exec_()而不是app.exec()?因为exec是python系统默认关键字,为了以示区别,所以写成exec_
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gui pyqt python