分享

使用PyQt5制作界面(实现界面与代码的分离)(二)

 刮骨剑 2019-03-07

使用PyQt5制作界面,网上代码漫天飞,但是实现界面与代码分离的例子不多,自己实现了一个,侥幸成功了,特此记录,害怕自己忘记了,以后也是一个参考!


1.启动Pycharm,新建一个工程,然后点击TOOL-->EXTERNAL TOOL选择Qt Designer(这个菜单的配置,请参考另一篇博文:PyQt5的安装),启动Qt Designer工具,制作界面。

在界面上放置了一个EditText,下面放置了两个按钮,一个按钮是“打开文件”,另一个按钮是“保存文件”,功能很简单,就是点击打开文件,选择一个txt文件,将里面的内容显示到EditText中,而且在界面设计的时候给QEditText设置对象名为txt_view,给打开文件按钮设置对象名为btn_open,另一个按钮设置名称为btn_save。保存界面为mainUi.ui,在PyCharm界面中,在mainUi.ui文件上单击鼠标右键,选择Extern tool工具中的PyUIC,将mainUI.ui转换为mainUi.py

mainUi.py代码如下:

mainUi.py代码如下:

  1. # -*- coding: utf-8 -*-
  2. # Form implementation generated from reading ui file 'mainUi.ui'
  3. #
  4. # Created by: PyQt5 UI code generator 5.10
  5. #
  6. # WARNING! All changes made in this file will be lost!
  7. from PyQt5 import QtCore, QtGui, QtWidgets
  8. class Ui_MainWindow(object):
  9. def setupUi(self, MainWindow):
  10. MainWindow.setObjectName("MainWindow")
  11. MainWindow.resize(498, 430)
  12. self.centralwidget = QtWidgets.QWidget(MainWindow)
  13. self.centralwidget.setObjectName("centralwidget")
  14. self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
  15. self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 501, 431))
  16. self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
  17. self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
  18. self.verticalLayout.setContentsMargins(0, 0, 0, 0)
  19. self.verticalLayout.setObjectName("verticalLayout")
  20. self.txt_view = QtWidgets.QTextEdit(self.verticalLayoutWidget)
  21. font = QtGui.QFont()
  22. font.setFamily("方正姚体")
  23. font.setPointSize(20)
  24. self.txt_view.setFont(font)
  25. self.txt_view.setObjectName("txt_view")
  26. self.verticalLayout.addWidget(self.txt_view)
  27. self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
  28. self.horizontalLayout_2.setObjectName("horizontalLayout_2")
  29. self.btn_open = QtWidgets.QPushButton(self.verticalLayoutWidget)
  30. self.btn_open.setObjectName("btn_open")
  31. self.horizontalLayout_2.addWidget(self.btn_open)
  32. self.btn_save = QtWidgets.QPushButton(self.verticalLayoutWidget)
  33. self.btn_save.setObjectName("btn_save")
  34. self.horizontalLayout_2.addWidget(self.btn_save)
  35. self.verticalLayout.addLayout(self.horizontalLayout_2)
  36. MainWindow.setCentralWidget(self.centralwidget)
  37. self.retranslateUi(MainWindow)
  38. QtCore.QMetaObject.connectSlotsByName(MainWindow)
  39. def retranslateUi(self, MainWindow):
  40. _translate = QtCore.QCoreApplication.translate
  41. MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
  42. self.btn_open.setText(_translate("MainWindow", "打开文件"))
  43. self.btn_save.setText(_translate("MainWindow", "保存文件"))

这些代码都是自动生成的,大家可以不需要动。

在生成的文件中有一个Ui_MainWindow类,这个类继承自object,这个类就是一个空的类,里面什么都没有,就是提供了一个容器,在容器内部生成了一个名字叫MainWindow的对象,设置对象的大小,然后将这个对象MainWindow作为父类生成了一个子对象centralwidget。centralwidget作为这个容器类的内部成员,这个对象centralwidget就是将来程序要运行的主窗口,在这个窗口内部放置了很多的控件,具体不详细论述了。

函数retranslateUi(self, MainWindow)的主要作用是设置控件的各种属性。

然后在Pycharm中添加一个新的py文件main.py,代码如下:

  1. import sys
  2. from PyQt5.QtWidgets import QApplication,QMainWindow,QFileDialog
  3. import mainUi
  4. class MainCode(QMainWindow,mainUi.Ui_MainWindow):
  5. def __init__(self):
  6. QMainWindow.__init__(self)
  7. mainUi.Ui_MainWindow.__init__(self)
  8. self.setupUi(self)
  9. self.btn_save.clicked.connect(self.on_save)
  10. self.btn_open.clicked.connect(self.on_open)
  11. def on_save(self):
  12. FullFileName,_=QFileDialog.getSaveFileName (self, '文件另存为', r'./','TXT (*.txt)')
  13. set_text=self.txt_view.toPlainText()
  14. with open(FullFileName,'wt') as f:
  15. print(set_text, file = f)
  16. def on_open(self):
  17. txtstr=""
  18. FullFileName, _ = QFileDialog.getOpenFileName(self, '打开', r'./', 'TXT (*.txt)')
  19. with open(FullFileName, 'rt') as f:
  20. lines=f.readlines()
  21. for line in lines:
  22. txtstr=txtstr+line
  23. self.txt_view.setText(txtstr)
  24. if __name__=='__main__':
  25. app=QApplication(sys.argv)
  26. md=MainCode()
  27. md.show()
  28. sys.exit(app.exec_())

 MainCode类又提供了一个容器,这个类继承自QMainWindow,mainUi.Ui_MainWindow,在这个类的构造函数中运行类父类的构造函数,并且把它自己作为参数产地给setupUi,并且添加了信号&槽信息

 self.btn_save.clicked.connect(self.on_save)

self.btn_open.clicked.connect(self.on_open)

这两个语句使得信号与槽函数进行手工绑定

函数

  1. def on_save(self):
  2. FullFileName,_=QFileDialog.getSaveFileName (self, '文件另存为', r'./','TXT (*.txt)')
  3. set_text=self.txt_view.toPlainText()
  4. with open(FullFileName,'wt') as f:
  5. print(set_text, file = f)
  6. def on_open(self):
  7. txtstr=""
  8. FullFileName, _ = QFileDialog.getOpenFileName(self, '打开', r'./', 'TXT (*.txt)')
  9. with open(FullFileName, 'rt') as f:
  10. lines=f.readlines()
  11. for line in lines:
  12. txtstr=txtstr+line
  13. self.txt_view.setText(txtstr)

是对按钮的响应函数

运行main.py这个程序,界面

这样在main.py文件中,没有涉及任何界面中的内容,开发人员只需要自己绑定信号&槽,然后专心槽函数的逻辑关系就行了,实现了界面与代码的分离。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多