运行时为什么GUI会闪退?
import pandas as pd
import mplfinance as mpf
import matplotlib.pyplot as plt
import numpy as np
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from PyQt5.QtWidgets import QDialog,QApplication,QLabel, QLineEdit,QMainWindow,QWidget, QVBoxLayout, QPushButton, QFileDialog, QTableWidget, QTableWidgetItem
from matplotlib.figure import Figure
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
class ExcelAnalyzer(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设置窗口标题和初始大小
self.setWindowTitle('Excel数据分析器')
self.setGeometry(100, 100, 800, 600)
# 创建垂直布局
layout = QVBoxLayout()
# 创建按钮,用于打开文件选择对话框
self.loadButton = QPushButton('加载Excel文件', self)
self.loadButton.clicked.connect(self.loadExcelFile)
layout.addWidget(self.loadButton)
# 设置布局
self.setLayout(layout)
# 打开文件选择对话框
def loadExcelFile(self):
filename, _ = QFileDialog.getOpenFileName(self, "选择Excel文件", "", "Excel Files (*.xlsx *.xls);;All Files (*)")
if filename:
self.loadExcelData(filename)
#读取表格
def loadExcelData(self, filename):
df = pd.read_excel(filename)
self.search_window = SearchScreen(self,df)
self.hide()
self.search_window.show()
class SearchScreen(QMainWindow):
def __init__(self, parent,df):
super().__init__(parent)
self.setWindowTitle("股票查询")
self.setGeometry(100, 100, 400, 300)
self.df = df
#搜索框
self.code_input = QLineEdit(self)
self.code_input.setPlaceholderText("输入代码(1001至1100)")
#搜索按钮
self.search_btn = QPushButton("搜索", self)
self.search_btn.clicked.connect(self.on_search_clicked)
#返回按钮
self.back_btn = QPushButton("返回", self)
self.back_btn.clicked.connect(self.on_back_clicked)
layout = QVBoxLayout()
layout.addWidget(self.code_input)
layout.addWidget(self.search_btn)
layout.addWidget(self.back_btn)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
def on_search_clicked(self):
code = self.code_input.text()
if code in [f'{number}' for number in range(1001,1101)]:
self.details_window = show_details(self,code,self.df)
self.details_window.show()
else:
self.currentPage = QLabel("无效的代码")
def on_back_clicked(self):
self.parent().show()
self.hide()
#详细信息页面
class show_details(QMainWindow):
def __init__(self, parent, code,df):
super().__init__(parent)
self.code = code
self.df = df
self.dfi = self.individual()
self.setWindowTitle("详细信息")
self.setGeometry(100, 100, 4000, 3000)
#返回按钮
self.back_btn = QPushButton("返回", self)
self.back_btn.setGeometry(3000,2500,400,200)
self.back_btn.clicked.connect(self.on_back_clicked)
#折线图按钮
self.price_btn = QPushButton('价格折线图',self)
self.price_btn.setGeometry(100,100,600,300)
self.price_btn.clicked.connect(self.show_price)
#k线图按钮
self.k_btn = QPushButton('k线图',self)
self.k_btn.setGeometry(700,100,600,300)
self.k_btn.clicked.connect(self.show_k)
#移动平均线按钮
self.mav_btn = QPushButton('移动平均线(5日、10日、30日)',self)
self.mav_btn.setGeometry(100,400,600,300)
self.mav_btn.clicked.connect(self.show_mav)
#提取、修改子表
def individual(self):
dfi = self.df[self.df['股票代码'] == int(self.code)]
dfi.set_index(['日期'],inplace = True)
dfi.index.name = 'Date'
dfi.columns = ['Number','Open','Close','High','Low','Volume','Limit','Amplitude','Turnover']
return dfi
#返回键link
def on_back_clicked(self):
self.parent().show()
self.hide()
#折线图link
def show_price(self):
dialog = priceDialog(self.dfi, self)
dialog.exec_()
#k线图link
def show_k(self):
dialog = kDialog(self.dfi, self)
dialog.exec_()
#移动平均线link
def show_mav(self):
dialog = mavDialog(self.dfi, self)
dialog.exec_()
#k线图 class
class kDialog(QDialog):
def __init__(self, dfi, parent=None):
super().__init__(parent)
self.dfi = dfi
self.initUI()
def initUI(self):
self.setWindowTitle('k线图')
self.setGeometry(300, 300, 600, 400)
#作图
self.fig, self.ax = mpf.plot(self.dfi,
type = 'candle',
style = 'charles',
ylabel = '价格',
xlabel = '时间',
volume = True,
ylabel_lower = '交易量',
returnfig = True)
self.canvas = FigureCanvasQTAgg(self.fig)
# 创建一个垂直布局并添加图表或错误信息
layout = QVBoxLayout()
layout.addWidget(self.canvas) # 确保添加 canvas 到布局
self.setLayout(layout)
#mav class
class mavDialog(QDialog):
def __init__(self, dfi, parent=None):
super().__init__(parent)
self.dfi = dfi
self.initUI()
def initUI(self):
self.setWindowTitle('移动平均线图')
self.setGeometry(300, 300, 600, 400)
#作图
self.fig, self.ax = mpf.plot(self.dfi,
type = 'line',
mav = (5,10,30),
mavcolor = ['red','blue','orange'],
ylabel = '价格',
datetime_format='%Y-%m-%d',
style = 'charles',
returnfig = True
)
self.ax[0].legend(['五日移动平均线','十日移动平均线','三十日移动平均线'])
self.canvas = FigureCanvasQTAgg(self.fig)
# 创建一个垂直布局并添加图表或错误信息
layout = QVBoxLayout()
layout.addWidget(self.canvas) # 确保添加 canvas 到布局
self.setLayout(layout)
#折线图 class
class priceDialog(QDialog):
def __init__(self, dfi, parent=None):
super().__init__(parent)
self.dfi = dfi
self.initUI()
def initUI(self):
self.setWindowTitle('价格折线图')
self.setGeometry(300, 300, 600, 400)
# 创建一个matplotlib图表
self.fig, self.ax = plt.subplots(figsize = (14,7))
self.ax.plot(self.dfi,color = 'blue')
self.ax.set_xlabel('时间')
self.ax.set_ylabel('价格')
self.canvas = FigureCanvasQTAgg(self.fig)
# 创建一个垂直布局并添加图表或错误信息
layout = QVBoxLayout()
layout.addWidget(self.canvas) # 确保添加 canvas 到布局
self.setLayout(layout)
# 创建实例
app = QApplication(sys.argv)
start_window = ExcelAnalyzer()
start_window.show()
sys.exit(app.exec())