ali_ssssa 2024-06-01 20:59 采纳率: 9.1%
浏览 1

用pyqt5写的GUI超时了

第一次写GUI,猛猛超时,能改的都改了,到底哪里有问题..
图片是保存好在文件夹里的,字典是计算好没有问题的,求大家帮我看看qwq



import sys
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QGridLayout, QLineEdit, QMessageBox,QTextEdit
from PyQt5.QtCore import Qt
from 股市精简分析 import ave_open_price_dic, ave_close_price_dic, ave_highest_price_dic,ave_lowest_price_dic, ave_trade_volume_dic, ave_price_limit_dic,ave_amplitude_dic,ave_turnover_dic, highest_price_dic,lowest_price_dic

class StartWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("股市精简分析(针对2021年100支股)")
        self.setGeometry(100, 100, 300, 200)

        start_btn = QPushButton("开始", self)
        start_btn.clicked.connect(self.on_start_clicked)

        layout = QVBoxLayout()
        layout.addWidget(start_btn)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def on_start_clicked(self):
        self.main_window = MainScreen(self)
        self.hide()
        self.main_window.show()

class MainScreen(QMainWindow):
    def __init__(self, start_window):
        super().__init__()
        self.start_window = start_window
        self.setWindowTitle("主页面")
        self.setGeometry(100, 100, 400, 300)

        self.overview_btn = QPushButton("股市总体情况概览", self)
        self.overview_btn.clicked.connect(self.on_overview_clicked)

        self.search_btn = QPushButton("单支股票查询", self)
        self.search_btn.clicked.connect(self.on_search_clicked)

        layout = QVBoxLayout()
        layout.addWidget(self.overview_btn)
        layout.addWidget(self.search_btn)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def on_overview_clicked(self):
        self.overview_window = OverviewScreen(self)
        self.overview_window.show()

    def on_search_clicked(self):
        self.search_window = SearchScreen(self)
        self.search_window.show()

# 股市总体情况按钮页面
class OverviewScreen(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle("股市总体情况概览")
        self.setGeometry(100, 100, 600, 400)

        self.back_btn = QPushButton("返回", self)
        self.back_btn.clicked.connect(self.on_back_clicked)

        # 创建图片按钮
        self.image_btns = []
        for i in range(1, 8):
            button = QPushButton(f"图片{i}", self)
            button.clicked.connect(lambda _, index=i: self.show_image(index))
            self.image_btns.append(button)

        # 添加图片按钮说明
        expl_overview_pic = QTextEdit(self)
        #expl_overview_pic.setGeomatry(50,50,500,300)
        expl_overview_pic.setText('图片1:各支股票在一年内的开盘、收盘均值柱状图 \n 图片2:各支股票在一年内的最高价柱状图 \n 图片3:各支股票在一年内的最低价柱状图 \n 图片4:各支股票在一年内的复合涨跌幅柱状图 \n 图片5:各支股票在一年内的平均振幅散点图 \n 图片6:各支股票在一年内的平均换手率柱状图 \n 图片7:各支股票总交易量柱状图')

    def on_back_clicked(self):
        self.parent().show()
        self.hide()

    def show_image(self, index):
        # 显示图片
        image_path = f"path_to_images/image{index}.png"  # 替换为实际图片路径
        label = QLabel(self)
        label.setPixmap(QPixmap(image_path))
        label.show()
        # 当关闭标签时返回到页面1
        label.destroyed.connect(self.return_to_overview)

    def return_to_overview(self):
        self.show()

class SearchScreen(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self.setWindowTitle("股票查询")
        self.setGeometry(100, 100, 400, 300)

        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)

        self.code = None

    def on_search_clicked(self):
        self.code = self.code_input.text()
        # 搜索股票代码的逻辑
        if self.code in [f'{number}' for number in range(1001,1101)]:
            self.details_window = show_details(self)
            self.details_window.show()    
        else:
            self.currentPage = QLabel("无效的代码")
        
        self.show_stock_details(self.code)

    def on_back_clicked(self):
        self.parent().show()
        self.hide()
        
class show_details(QMainWindow):
    def __init__(self,parent):
        super().__init__(parent)
        self.setWindowTitle(f"代码为{self.code}的股票的详细信息")
        self.setGeometry(100, 100, 600, 400)
        
        self.back_btn = QPushButton("返回", self)
        self.back_btn.clicked.connect(self.on_back_clicked)
      
        self.image_btns = []
        for i in range(1,7):
            button = QPushButton(f'图片{i}', self)
            button.clicked.connect(lambda _, index=i: self.show_image(index))
            self.image_btns.append(button)

            # 添加股票详细信息及图片按钮说明
            pre_info = QTextEdit(self)
            #pre_info.setGeometry(50,50, 500, 300)
            pre_info.setText('开盘价年均值',ave_open_price_dic[self.code],'\n收盘价年均',ave_close_price_dic[self.code],'\n 最高价',highest_price_dic[self.code],'\n最低价',lowest_price_dic[self.code],'\n最高价年均',ave_highest_price_dic[self.code],'\n最低价年均',ave_lowest_price_dic[self.code],'\n交易量年均',ave_trade_volume_dic[self.code],'\n换手率年均',ave_turnover_dic[self.code],'/n','涨跌幅年均',ave_price_limit_dic[self.code],'振幅年均',ave_amplitude_dic[self.code])       
            
            expl_detail_pic = QTextEdit(self)
            #expl_detail_pic.setGeomatry(50,50,500,300)
            expl_detail_pic.setText('图片1:价格走势折线图 \n 图片2:成交量柱状图 \n 图片3:涨跌幅散点图 \n 图片4:振幅折线图 \n 图片5:换手率柱状图 \n 图片6:移动平均线图 /n 图片7:k线图')

    def show_image(self, index):
        # 显示图片
        image_path = f"股票代码为{self.code}的图片{index}"  
        label = QLabel(self)
        label.setPixmap(QPixmap(image_path))
        label.show()
        # 当关闭标签时返回到页面1
        label.destroyed.connect(self.return_to_overview)

    def on_back_clicked(self):
        self.parent().show()
        self.hide()

#创建实例
app = QApplication(sys.argv)
start_window = StartWindow()
start_window.show()
sys.exit(app.exec())

  • 写回答

3条回答 默认 最新

  • 关注

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

    看起来你的代码中存在一个可能的问题:OverviewScreen 类中的 show_image 方法试图直接从字符串 image_path 加载图片,但是没有指定实际的图片路径。你需要将 image_path 变量替换为你实际存放图片的文件夹路径。

    此外,为了提高代码可读性和避免潜在的超时问题,你可以考虑以下几点:

    1. 异步加载图片:在显示图片时,使用 QThreadQFuture 进行异步操作,避免阻塞主线程。

    2. 优化图片处理:如果你有大量图片,可以考虑使用 PIL 库对图片进行预处理,如缩放或裁剪,以减少内存消耗。

    3. 代码重构:尽量保持函数和类的职责单一,避免在一个地方做太多事情。例如,可以创建一个专门负责加载图片的辅助函数。

    4. 检查网络连接:如果图片是从网络加载的,确保程序有网络连接。

    解决方案

    1. 修改 OverviewScreen 类的 show_image 方法
    def show_image(self, index):
        # 异步加载图片
        from PyQt5.QtCore import QTimer, pyqtSignal
        from PyQt5.QtWidgets import QLabel, QVBoxLayout
    
        class ImageLoader:
            image_loaded = pyqtSignal(str, QPixmap)
    
        loader = ImageLoader()
        loader.image_loaded.connect(self.show_image_on_main_thread)
    
        QTimer.singleShot(0, lambda: loader.load_image(index))
    
        def load_image(self, index):
            image_path = "path_to_images/image{}.png".format(index)  # 替换为实际图片路径
            pixmap = QPixmap(image_path)
            if pixmap.isNull():
                QMessageBox.warning(self, "警告", "图片加载失败!")
                return
            loader.image_loaded.emit(image_path, pixmap)
    
        def show_image_on_main_thread(self, image_path, pixmap):
            label = QLabel(self)
            label.setPixmap(pixmap)
            layout = QVBoxLayout()
            layout.addWidget(label)
            widget = QWidget()
            widget.setLayout(layout)
            self.setCentralWidget(widget)
            label.destroyed.connect(self.return_to_overview)
    
        loader.image_loaded.emit(image_path, pixmap)
    
    1. 其他优化建议
      • 如果图片是从网络加载的,添加网络请求错误处理。
      • 对于字典数据,考虑使用 json 模块存储和加载,减少内存占用。

    确保在运行代码之前,已经将图片路径设置为正确的文件夹路径。希望这能帮助你解决问题!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月1日

悬赏问题

  • ¥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 三个简单项目写完之后有重赏之后联系我