在pyqt5中读取的csv文件用matplotlib画多个子图想加一个鼠标滑轮滚动页面,结果程序出现问题

显示的问题是

img


代码如下




# -*- coding: UTF-8 -*-

# Form implementation generated from reading ui file 'dataEXCEL.ui'
#
# Created by: PyQt5 UI code generator 5.11.2
#
# WARNING! All changes made in this file will be lost!

from figureax import *
from PyQt5 import QtCore, QtGui
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import qApp, QFileDialog, QScrollArea, QVBoxLayout, QMainWindow, QApplication, QWidget
from matplotlib.backends.backend_qt5agg import (
                        FigureCanvasQTAgg as FigureCanvas,
                        NavigationToolbar2QT as NavigationToolbar,
)


import matplotlib
import sys
import pandas as pd
import os
import glob
import numpy as np
import matplotlib.pyplot as plt
root=""
matplotlib.use('Qt5Agg')
fileNum = 0
myrow=0


plt.rcParams['font.sans-serif'] = ['SimHei']    # 用来正常显示中文字符
plt.rcParams['axes.unicode_minus'] = False



class MyApp(QWidget):
    def __init__(self, fig):
        super().__init__()
        self.title = 'VERTICAL, HORIZONTAL SCROLLABLE WINDOW : HERE!'
        self.posXY = (700, 40)
        self.windowSize = (1200, 800)
        self.fig = fig
        self.initUI()

    def initUI(self):
        QMainWindow().setCentralWidget(QWidget())

        self.setLayout(QVBoxLayout())
        self.layout().setContentsMargins(0, 0, 0, 0)
        self.layout().setSpacing(0)

        canvas = FigCanvas(self.fig)
        canvas.draw()

        scroll = QScrollArea(self)
        scroll.setWidget(canvas)

        nav = NabToolbar(canvas, self)
        self.layout().addWidget(nav)
        self.layout().addWidget(scroll)

        self.show_basic()

    def show_basic(self):
        self.setWindowTitle(self.title)
        self.setGeometry(*self.posXY, *self.windowSize)
        self.show()

def show_fig(fig):
    app = QApplication(sys.argv)
    window = MyApp(fig)
    sys.exit(app.exec_())

class Ui_MainWindow(QtWidgets.QWidget):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(838, 596)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.list1 = QtWidgets.QListView(self.centralwidget)
        self.list1.setGeometry(QtCore.QRect(1, 1, 171, 401))
        self.list1.setObjectName("list1")
        self.text1 = QtWidgets.QTextEdit(self.centralwidget)
        self.text1.setGeometry(QtCore.QRect(110, 450, 631, 21))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.text1.sizePolicy().hasHeightForWidth())
        self.text1.setSizePolicy(sizePolicy)
        self.text1.setObjectName("text1")
        self.viewButton = QtWidgets.QPushButton(self.centralwidget)
        self.viewButton.setGeometry(QtCore.QRect(746, 450, 75, 23))
        self.viewButton.setObjectName("viewButton")

        self.rButton1 = QtWidgets.QRadioButton(self.centralwidget)
        self.rButton1.setGeometry(QtCore.QRect(10, 450, 111, 16))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.rButton1.setFont(font)
        self.rButton1.setObjectName("rButton1")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setEnabled(False)
        self.label.setGeometry(QtCore.QRect(7, 409, 61, 16))
        font = QtGui.QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.rButton2 = QtWidgets.QRadioButton(self.centralwidget)
        self.rButton2.setGeometry(QtCore.QRect(10, 430, 131, 16))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.rButton2.setFont(font)
        self.rButton2.setCheckable(True)
        self.rButton2.setChecked(True)
        self.rButton2.setObjectName("rButton2")

        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(170, 0, 661, 401))
        #水平滚动条
        self.textEdit.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.textEdit.setObjectName("textEdit")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 838, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtWidgets.QToolBar(MainWindow)
        self.toolBar.setEnabled(True)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.toolBar.sizePolicy().hasHeightForWidth())
        self.toolBar.setSizePolicy(sizePolicy)
        self.toolBar.setMouseTracking(False)
        self.toolBar.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.toolBar.setAcceptDrops(True)
        self.toolBar.setAutoFillBackground(False)
        self.toolBar.setInputMethodHints(QtCore.Qt.ImhNone)
        self.toolBar.setAllowedAreas(QtCore.Qt.AllToolBarAreas)
        self.toolBar.setIconSize(QtCore.QSize(48, 48))
        self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
        self.toolBar.setFloatable(False)
        self.toolBar.setObjectName("toolBar")
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.button1 = QtWidgets.QAction(MainWindow)
        icon = QtGui.QIcon.fromTheme("导入EXCEL")
        icon.addPixmap(QtGui.QPixmap("image/图标-01.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.button1.setIcon(icon)
        self.button1.setObjectName("button1")
        self.button2 = QtWidgets.QAction(MainWindow)
        #self.button2.setCheckable(True)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("image/图标-02.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.button2.setIcon(icon)
        self.button2.setObjectName("button2")
        self.button3 = QtWidgets.QAction(MainWindow)
        #self.button3.setCheckable(True)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("image/图标-03.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.button3.setIcon(icon1)
        self.button3.setObjectName("button3")
        self.button4 = QtWidgets.QAction(MainWindow)
        #self.button4.setCheckable(True)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("image/图标-04.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.button4.setIcon(icon2)
        self.button4.setObjectName("button4")
        self.button5 = QtWidgets.QAction(MainWindow)
        #self.button5.setCheckable(True)
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap("image/图标-05.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.button5.setIcon(icon3)
        self.button5.setObjectName("button5")
        self.button6 = QtWidgets.QAction(MainWindow)
        #self.button6.setCheckable(True)
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap("image/图标-06.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.button6.setIcon(icon4)
        self.button6.setObjectName("button6")
        self.button7 = QtWidgets.QAction(MainWindow)
        #self.button7.setCheckable(True)
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap("image/图标-07.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.button7.setIcon(icon5)
        self.button7.setObjectName("button7")
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.button1)
        self.toolBar.addAction(self.button2)
        self.toolBar.addSeparator()
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.button3)
        self.toolBar.addAction(self.button4)
        self.toolBar.addAction(self.button5)
        self.toolBar.addAction(self.button6)
        self.toolBar.addSeparator()
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.button7)
        self.toolBar.addSeparator()
        # 单击工具栏“退出”按钮退出程序
        self.button7.triggered.connect(qApp.quit)
        # 单击工具栏按钮触发自定义槽函数
        self.button1.triggered.connect(self.click1)
        self.button2.triggered.connect(self.click2)
        self.button3.triggered.connect(self.click3)
        self.button4.triggered.connect(self.click4)
        self.button5.triggered.connect(self.click5)
        self.button6.triggered.connect(self.click6)
        #单击"浏览"按钮,选择文件存储路径
        self.viewButton.clicked.connect(self.viewButton_click)
        # 单击QListView列表触发自定义的槽函数
        self.list1.clicked.connect(self.clicked)
        # 设置Dataframe对象显示所有列
        pd.set_option('display.max_columns', None)
        # 设置Dataframe对象列宽为200,默认为50
        pd.set_option('max_colwidth', 200)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Excel数据分析师"))
        self.viewButton.setText(_translate("MainWindow", "浏览"))
        self.rButton1.setText(_translate("MainWindow", "自定义文件夹"))
        self.label.setText(_translate("MainWindow", "输出选项"))
        self.rButton2.setText(_translate("MainWindow", "保存在原文件夹内"))
        self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
        self.button1.setText(_translate("MainWindow", "导入EXCEL"))
        self.button2.setText(_translate("MainWindow", "提取列数据"))
        self.button3.setText(_translate("MainWindow", "定向筛选"))
        self.button3.setToolTip(_translate("MainWindow", "定向筛选"))
        self.button4.setText(_translate("MainWindow", "多表合并"))
        self.button5.setText(_translate("MainWindow", "多表统计排行"))
        self.button5.setToolTip(_translate("MainWindow", "多表统计排行"))
        self.button6.setText(_translate("MainWindow", "生成图表"))
        self.button6.setToolTip(_translate("MainWindow", "生成图表"))
        self.button7.setText(_translate("MainWindow", "退出"))
        self.button7.setToolTip(_translate("MainWindow", "退出"))


    def click1(self):
        # 文件夹路径
        global root
        root = QFileDialog.getExistingDirectory(self, "选择文件夹", "/")
        mylist = []
        # 遍历文件夹文件
        for dirpath, dirnames, filenames in os.walk(root):
            for filepath in filenames:
                # mylist.append(os.path.join(dirpath, filepath))
                mylist.append(os.path.join(filepath))
        # 实例化列表模型,添加数据列表
        self.model = QtCore.QStringListModel()
        # 添加列表数据
        self.model.setStringList(mylist)
        self.list1.setModel(self.model)
        self.list1 = mylist

    # 单击左侧目录右侧表格显示数据
    def clicked(self, qModelIndex):
        global root
        global myrow
        myrow=qModelIndex.row()
        # 获取当前选中行的数据
        a = root + '/' + str(self.list1[qModelIndex.row()])
        df = pd.DataFrame(pd.read_csv(a,encoding='gbk'))
        self.textEdit.setText(str(df))

    #提取列数据
    def click2(self):
   
      
    #定向筛选
    def click3(self):
        
    #多表合并
    def click4(self):
        
    #多表统计排行
    def click5(self):
        
    def click6(self):

        global root
        global myrow
        global fig
        fig = plt.figure(num=1, figsize=(14, 10))
        a = root + '/' + str(self.list1[myrow])
        df = pd.DataFrame(pd.read_csv(a, encoding='gbk'))
        mylist = []
        for i in range(len(df.columns)):
            mylist.append(str(df.columns[i]))  # mylist存储列标题
        xlist = []
        list1 = []
        liststr = []
        xlist = df[str(mylist[0])].apply(int)  # 作为x轴
        list1 = df[str(mylist[1])].apply(str)  # list1存储除了数据1
        if df.duplicated(subset=str(df.columns[1])).sum() == (len(list1) - 1):
            x = 1
        else:
            x = 0
        print(x)
        for i in range(len(df.columns)):
            ylist = []
            ylist = df[str(mylist[i])]
            if df.duplicated(subset=str(df.columns[i])).sum() == (len(ylist) - 1) or i == 0:
                print(str(df.columns[i]) + '=' + str(ylist[1]))
                continue
            else:
                print(df[str(df.columns[i])].value_counts())  # 统计列各元素出现的次数
                df1 = df[str(df.columns[i])].value_counts()
                num = [i for i in range(1, len(df[str(df.columns[i])]))]
                ax1 = fig.add_subplot(len(mylist), 2, i + x)
                ax1.plot(xlist, ylist)
                for a, b in zip(xlist, ylist):
                    s = str('(' + str(a) + ',' + str(b) + ')')
                    plt.text(a, b, s, ha='center', va='bottom', fontsize=9)
                x += 1
                plt.ylabel(str(mylist[i]), labelpad=0)
                ax2 = fig.add_subplot(len(mylist), 2, i + x)
                plt.bar(df1.index, df1, width=0.5)
                for a, b in zip(df1.index, df1):
                    s = str('(' + str(a) + ',' + str(b) + ')')
                    plt.text(a, b, s, ha='center', va='bottom')
        plt.xlabel(str(mylist[0]), labelpad=0)

        plt.subplots_adjust(wspace=0.3, hspace=0.5)
        show_fig(fig)



        # 单击“浏览”按钮选择文件存储路径

   

# 定义载入主窗体的方法
def show_MainWindow():
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())


if __name__ == "__main__":
        show_MainWindow()
        path=root
        # visitDir(path)

img

其他功能还没有开始写,主要是click6这个功能实现不了,刚开始pyqt5,不问题出在哪,试过多线程和qcoreapplication.quit都不太行,希望能帮忙解决

跟踪一下,看看哪里报错,死循环?