ali_ssssa 2024-06-02 20:32 采纳率: 9.1%
浏览 4

这段代码运行时为什么GUI闪退?

运行时为什么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())
        

  • 写回答

3条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    运行时GUI会闪退的原因可能有以下几点:

    1. 代码逻辑错误:在代码中可能存在逻辑错误或者异常,导致程序运行出错而闪退。可以通过调试代码、查看错误信息来定位并解决问题。
    2. GUI组件使用错误:在代码中可能存在对GUI组件的错误使用,例如错误的布局、组件放置位置不正确等。这些错误可能导致窗口无法正常显示或者响应用户的操作,从而导致闪退。可以通过仔细检查代码、查看GUI组件相关的文档来解决问题。
    3. 第三方库版本不兼容:在代码中使用了一些第三方库,可能存在与其他库或者Python版本不兼容的情况。这可能导致程序运行时出现异常并闪退。可以通过查看第三方库的文档、更新库的版本、检查Python版本来解决问题。

    解决方案:

    1. 仔细检查代码逻辑,确保没有错误或异常。
    2. 确认GUI组件的使用方法是否正确,布局和位置是否符合需求。
    3. 确认所使用的第三方库的版本是否与其他库或Python版本兼容。如果不兼容,可以尝试更新库的版本或切换Python版本。

    修改后的代码:

    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()
    
    
    app = QApplication(sys.argv)
    ex = ExcelAnalyzer()
    ex.show()
    sys.exit(app.exec_())
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月2日

悬赏问题

  • ¥15 俄罗斯方块中无法同时消除多个满行
  • ¥15 c#转安卓 java html
  • ¥15 os.listdir文件路径找不到
  • ¥15 使用gojs3.0,如何在nodeDataArray设置好text的位置,再go.TextBlock alignment中进行相应的改变
  • ¥15 psfusion图像融合指标很低
  • ¥15 银河麒麟linux系统如何修改/etc/hosts权限为777
  • ¥50 医院HIS系统代码、逻辑学习
  • ¥30 docker离线安装mysql报错,如何解决?
  • ¥15 构建工单的总账影响在哪里查询或修改
  • ¥15 三个简单项目写完之后有重赏之后联系我