前言
如果经常使用PyQt5这种模块来编写带UI界面的程序,那么很自然的就会涉及到,一旦程序比较大,UI控件多的时候,需要将UI和逻辑程序分离,这样方便管理,也方便维护。
配置:
平台:windows
工具:visual studio code
语言:python
库:PyQt5
本文将提供一个简单但可用的实例,在PyQt5下,分别编写一个UI布局的py文件,和一个提供函数功能的py文件,然后调用UI文件,生成窗口,使用窗口部件调用函数。
项目导览:
我们在项目文件夹下,新建mainUI.py、program.py两个文件,其中mainUI.py编写控件布局,program.py编写函数功能。
本文中,我们实现一个打开文本并显示文本内容的程序,那么UI界面上就需要以下部件:
按钮、标签、文本框
UI实例如下:
来看看以下UI代码:
MainUi.py
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MainUI(object):
def initUI(self):
self.btn=QPushButton('打开文件',self)
self.btn.setGeometry(40,40,80,40)
self.lbl1=QLabel(self)
self.lbl1.setGeometry(40,100,80,20)
self.lbl1.setText('文本路径:')
self.lbl2=QLabel(self)
self.lbl2.setGeometry(140,100,200,20)
self.le=QTextEdit(self)
self.le.setGeometry(40,140,200,200)
self.setWindowTitle('文本UI')
self.setGeometry(100,100,400,400)
self.show()
这是一个非常简单的示例,如果你需要更多的部件,那么往上添加即可。
这里说明一下,网上有很多文章都是用Qt提供的编辑器Qt designer来进行UI编辑的,这当然是没问题的,毕竟UI设计不能直接拖动部件的确是不太方便的, 但实际上,如果你的UI不是那么复杂,那么直接在visual studio code里面来编辑布局也是可以的,就是需要稍微计算一下部件的位置。
因为Qt designer设计的ui文件,还需要转换才能变为可用的py文件。
本文不使用这种方式,但逻辑上应该是差不多的,只是设计UI时方式不一样。
现在UI设计好了,那么需要进行函数功能的编写了。
在本文中涉及到两个功能,一是打开文本文件,二是读取文本内容。
program.py
打开文档:
self.path1,_=QFileDialog.getOpenFileName(self,'','E:/',"txt(*.txt);\nAll(*.*)")
使用Qfiledialog即可。
读取文本:
with open(file,'r',encoding='utf-8') as texts:
rdtxt=texts.read()
使用python内置的open函数,可以打开文本文件并读取其内容。
program.py完整代码:
import sys
import os
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from mainUI import MainUI
class MmWin(QMainWindow,MainUI):
def __init__(self,parent=None):
super(MmWin,self).__init__(parent)
self.initUI()
self.btn.clicked.connect(self.opentxt_func)
def opentxt_func(self):
"""打开文档"""
self.path1,_=QFileDialog.getOpenFileName(self,'','E:/',"txt(*.txt);\nAll(*.*)")
if os.path.exists(self.path1):
self.lbl2.setText(self.path1)
tt=self.readtxt_func(self.path1)
print(tt)
self.le.setText(tt)
def readtxt_func(self,file):
"""读取文档"""
with open(file,'r',encoding='utf-8') as texts:
rdtxt=texts.read()
return rdtxt
if __name__ == '__main__':
app=QApplication(sys.argv)
mw=MmWin()
sys.exit(app.exec_())
动态演示: