电竞比分网-中国电竞赛事及体育赛事平台

分享

使用PyQt5制作界面(實(shí)現(xiàn)界面與代碼的分離)(二)

 刮骨劍 2019-03-07

使用PyQt5制作界面,網(wǎng)上代碼漫天飛,但是實(shí)現(xiàn)界面與代碼分離的例子不多,自己實(shí)現(xiàn)了一個(gè),僥幸成功了,特此記錄,害怕自己忘記了,以后也是一個(gè)參考!


1.啟動(dòng)Pycharm,新建一個(gè)工程,然后點(diǎn)擊TOOL-->EXTERNAL TOOL選擇Qt Designer(這個(gè)菜單的配置,請(qǐng)參考另一篇博文:PyQt5的安裝),啟動(dòng)Qt Designer工具,制作界面。

在界面上放置了一個(gè)EditText,下面放置了兩個(gè)按鈕,一個(gè)按鈕是“打開(kāi)文件”,另一個(gè)按鈕是“保存文件”,功能很簡(jiǎn)單,就是點(diǎn)擊打開(kāi)文件,選擇一個(gè)txt文件,將里面的內(nèi)容顯示到EditText中,而且在界面設(shè)計(jì)的時(shí)候給QEditText設(shè)置對(duì)象名為txt_view,給打開(kāi)文件按鈕設(shè)置對(duì)象名為btn_open,另一個(gè)按鈕設(shè)置名稱(chēng)為btn_save。保存界面為mainUi.ui,在PyCharm界面中,在mainUi.ui文件上單擊鼠標(biāo)右鍵,選擇Extern tool工具中的PyUIC,將mainUI.ui轉(zhuǎn)換為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", "打開(kāi)文件"))
  43. self.btn_save.setText(_translate("MainWindow", "保存文件"))

這些代碼都是自動(dòng)生成的,大家可以不需要?jiǎng)印?/code>

在生成的文件中有一個(gè)Ui_MainWindow類(lèi),這個(gè)類(lèi)繼承自object,這個(gè)類(lèi)就是一個(gè)空的類(lèi),里面什么都沒(méi)有,就是提供了一個(gè)容器,在容器內(nèi)部生成了一個(gè)名字叫MainWindow的對(duì)象,設(shè)置對(duì)象的大小,然后將這個(gè)對(duì)象MainWindow作為父類(lèi)生成了一個(gè)子對(duì)象centralwidget。centralwidget作為這個(gè)容器類(lèi)的內(nèi)部成員,這個(gè)對(duì)象centralwidget就是將來(lái)程序要運(yùn)行的主窗口,在這個(gè)窗口內(nèi)部放置了很多的控件,具體不詳細(xì)論述了。

函數(shù)retranslateUi(self, MainWindow)的主要作用是設(shè)置控件的各種屬性。

然后在Pycharm中添加一個(gè)新的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, '打開(kāi)', 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類(lèi)又提供了一個(gè)容器,這個(gè)類(lèi)繼承自QMainWindow,mainUi.Ui_MainWindow,在這個(gè)類(lèi)的構(gòu)造函數(shù)中運(yùn)行類(lèi)父類(lèi)的構(gòu)造函數(shù),并且把它自己作為參數(shù)產(chǎn)地給setupUi,并且添加了信號(hào)&槽信息

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

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

這兩個(gè)語(yǔ)句使得信號(hào)與槽函數(shù)進(jìn)行手工綁定

函數(shù)

  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, '打開(kāi)', 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)

是對(duì)按鈕的響應(yīng)函數(shù)

運(yùn)行main.py這個(gè)程序,界面

這樣在main.py文件中,沒(méi)有涉及任何界面中的內(nèi)容,開(kāi)發(fā)人員只需要自己綁定信號(hào)&槽,然后專(zhuān)心槽函數(shù)的邏輯關(guān)系就行了,實(shí)現(xiàn)了界面與代碼的分離。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多