在VSCode编辑器我们通过引入pyqt5,用QTdesigner 实现拖拽实现图形化界面
下面我们实现一个简单项目实践一下吧
效果图:
用法:Python编写逻辑,用pyqt实现界面显示。
功能:
- 第一行把处理的数据文件拖拽到文本框中
- 第二行是对文件数据中相同项的哪一行取值的处理,比如取相同产品的第一条数据我们可以输入数值1
- 选择框B\R则是表示从前取值/从后取值
实现流程:
下面我们就直接讲述怎么拖拽实现图像化界
桌面先创建一个文件夹,vscode中打开该文件夹,右键(参考前一篇文章)启用pyqt的qtdesigner进行图形化界面设计,首先创建一个widget窗体。
再窗体上对组件进行拖拽设计,首先布局水平方向的设计,再水平方向上的基础上拖入lable,linetext,radiobutton,pushBotton组件,raddiobutton之间加入了横向的horizontal spacer 熟称弹簧使组件间具有一定的间隙。
设计完成后保存,如下图就会看到.UI的文件,pyuic5对其进行编译(前一篇文章有提)生成ui
-xxx.py文件
代码部分
整体代码结构(fristwin.py为启动文件;getdata.ui图形化设计,ui_getdata.py图形化设计的转译,以及getdataBR.py四个文件构成)
ui_getdataBR.py代码参考
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file '/Users/a1234/Desktop/pyqt5/Getdata.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(515, 352)self.verticalLayoutWidget = QtWidgets.QWidget(Form)self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 10, 481, 311))self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)self.verticalLayout.setContentsMargins(0, 0, 0, 0)self.verticalLayout.setObjectName("verticalLayout")self.label = QtWidgets.QLabel(self.verticalLayoutWidget)self.label.setObjectName("label")self.verticalLayout.addWidget(self.label)spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.verticalLayout.addItem(spacerItem)self.lineEdit = QtWidgets.QLineEdit(self.verticalLayoutWidget)self.lineEdit.setObjectName("lineEdit")self.verticalLayout.addWidget(self.lineEdit)spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.verticalLayout.addItem(spacerItem1)self.lineEdit_2 = QtWidgets.QLineEdit(self.verticalLayoutWidget)self.lineEdit_2.setObjectName("lineEdit_2")self.verticalLayout.addWidget(self.lineEdit_2)self.radioButton = QtWidgets.QRadioButton(self.verticalLayoutWidget)self.radioButton.setObjectName("radioButton")self.verticalLayout.addWidget(self.radioButton)spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)self.verticalLayout.addItem(spacerItem2)self.radioButton_2 = QtWidgets.QRadioButton(self.verticalLayoutWidget)self.radioButton_2.setObjectName("radioButton_2")self.verticalLayout.addWidget(self.radioButton_2)self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)self.pushButton.setObjectName("pushButton")self.verticalLayout.addWidget(self.pushButton)spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)self.verticalLayout.addItem(spacerItem3)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.label.setText(_translate("Form", "该工具用于对数据进行处理取值(B是从前取值,R从后取值)"))self.lineEdit.setPlaceholderText(_translate("Form", "拖拽数据文件"))self.lineEdit_2.setPlaceholderText(_translate("Form", "输入数值获取几条数据"))self.radioButton.setText(_translate("Form", "B"))self.radioButton.setChecked(True)self.radioButton_2.setText(_translate("Form", "R"))self.pushButton.setText(_translate("Form", "提交"))
getdataBR.py代码参考,定义一个类,对数据文件进行逻辑处理
import os
import pandas as pd
import numpy as np
import csv
class GetDataBR:def getvalue(data,reverse,countdata):data_temp=pd.read_csv(data,header=1,low_memory=False)with open(data,'r') as f:reader=csv.reader(f)header_row=next(reader)df =pd.read_csv(f,keep_default_na=False,low_memory=False)df_row = pd.DataFrame([header_row],columns=df.columns)df_fake = pd.DataFrame([df.columns],columns= df.columns)df_head = df.head(5)if reverse=="B":information=data_temp.groupby(['SerialNumber']).apply(lambda x: x.iloc[:countdata])elif reverse=="R":information=data_temp.groupby(['SerialNumber']).apply(lambda x:x.iloc[-countdata:])else:pass#print(information)datafinal = pd.concat([df_row,df_fake,df_head,information])filename = os.path.join(data.split(".")[0]+'append.csv')datafinal.to_csv(filename,header=None,index=False) del data_tempreturn datafinal
firstWin.py代码参考,把业务逻辑代码和界面设计进行联合实现一个简单的数据处理工具
# -*- coding: utf-8 -*-import sysfrom PyQt5.QtGui import QDropEvent
from GetDataBR import *
import os
from Ui_Getdata import Ui_Form
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow,QPushButton,QMessageBox,QFileDialog
from PyQt5 import QtCoreclass MyMianWindow(QMainWindow,Ui_Form):def __init__(self, parent=None):super(QMainWindow,self).__init__(parent)self.setupUi(self)self.setWindowTitle('数据处理工具')self.setObjectName('win')self.setStyleSheet('#win{background-color:white;}')self.initButton()def initButton(self):self.lineEdit.installEventFilter(QEventHandler(self))self.pushButton.clicked.connect(self.process_msg)#定义一个函数实现数据处理功能def process_msg(self):load_csv =self.lineEdit.text()countdata=self.lineEdit_2.text()if self.radioButton.isChecked()==True:reverse=self.radioButton.text()elif self.radioButton_2.isChecked()==True:reverse=self.radioButton_2.text()else:passprint(load_csv,countdata,reverse)self.imessage=GetDataBR.getvalue(load_csv,reverse,int(countdata))if self.imessage.empty==True:QMessageBox.information(self, '提示', 'do not complete the task')else:QMessageBox.information(self, '提示', 'complete the task')#定义事件处理机制文件的拖拽功能
class QEventHandler(QtCore.QObject):def eventFilter(self,obj,evnet):if evnet.type()==QtCore.QEvent.DragEnter:evnet.accept()if evnet.type()==QtCore.QEvent.Drop:md=evnet.mimeData()if md.hasUrls():url=md.urls()[0]obj.setText(url.toLocalFile())return Truereturn super().eventFilter(obj,evnet)if __name__=="__main__":app = QApplication(sys.argv) ui=MyMianWindow() ui.show()sys.exit(app.exec_())
到此就实现了开头所示的功能。
fighting~~~~~~