PyQt5 designer 生成的界面 QFileDialog调用时闪退

将参数self 改为:self.centralwidget

    def load_datas(self):
        print("111")
        filename, _ = QtWidgets.QFileDialog.getOpenFileName(self.centralwidget, "选取数据源文件", ".", "Excel文件 (*.xlsx)")
好的,下面是一个简单的 Python 归一化算法的实现,包含了你提到的所有功能,以及使用 PyQt5 模块创建的 GUI 界面。这个程序可以将多个数据归一化到 [0, 1] 的范围内,支持手动输入和按照模板导入数据两种方式。 ```python import sys import os import numpy as np import pandas as pd from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, \ QLineEdit, QPushButton, QFileDialog, QMessageBox, QTableWidget, QTableWidgetItem from PyQt5.QtCore import Qt class Normalization(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("归一化算法") self.setGeometry(300, 300, 800, 600) # 设置主窗口部件 self.central_widget = QWidget() self.setCentralWidget(self.central_widget) # 设置垂直布局 self.v_layout = QVBoxLayout() self.central_widget.setLayout(self.v_layout) # 设置输入部件 self.input_widget = QWidget() self.input_v_layout = QVBoxLayout() self.input_widget.setLayout(self.input_v_layout) self.v_layout.addWidget(self.input_widget) # 设置输入方式部件 self.input_method_widget = QWidget() self.input_method_h_layout = QHBoxLayout() self.input_method_widget.setLayout(self.input_method_h_layout) self.input_v_layout.addWidget(self.input_method_widget) # 设置输入方式标签 self.input_method_label = QLabel("输入方式:") self.input_method_h_layout.addWidget(self.input_method_label) # 设置手动输入按钮 self.manual_input_button = QPushButton("手动输入") self.manual_input_button.clicked.connect(self.manual_input) self.input_method_h_layout.addWidget(self.manual_input_button) # 设置导入数据按钮 self.import_data_button = QPushButton("导入数据") self.import_data_button.clicked.connect(self.import_data) self.input_method_h_layout.addWidget(self.import_data_button) # 设置输入区分符部件 self.separator_widget = QWidget() self.separator_h_layout = QHBoxLayout() self.separator_widget.setLayout(self.separator_h_layout) self.input_v_layout.addWidget(self.separator_widget) self.separator_widget.hide() # 设置输入区分符标签 self.separator_label = QLabel("输入区分符:") self.separator_h_layout.addWidget(self.separator_label) # 设置输入区分符文本框 self.separator_edit = QLineEdit() self.separator_edit.setPlaceholderText("多个数据的分隔符,默认为逗号") self.separator_h_layout.addWidget(self.separator_edit) # 设置输入数据部件 self.input_data_widget = QWidget() self.input_data_v_layout = QVBoxLayout() self.input_data_widget.setLayout(self.input_data_v_layout) self.input_v_layout.addWidget(self.input_data_widget) self.input_data_widget.hide() # 设置输入数据标签 self.input_data_label = QLabel("输入数据:") self.input_data_v_layout.addWidget(self.input_data_label) # 设置输入数据文本框 self.input_data_edit = QLineEdit() self.input_data_edit.setPlaceholderText("输入多个数据,用区分符分隔,按回车结束") self.input_data_edit.returnPressed.connect(self.calculate) self.input_data_v_layout.addWidget(self.input_data_edit) # 设置结果部件 self.result_widget = QWidget() self.result_v_layout = QVBoxLayout() self.result_widget.setLayout(self.result_v_layout) self.v_layout.addWidget(self.result_widget) self.result_widget.hide() # 设置结果标签 self.result_label = QLabel("归一化结果:") self.result_v_layout.addWidget(self.result_label) # 设置结果表格 self.result_table = QTableWidget() self.result_table.setColumnCount(2) self.result_table.setHorizontalHeaderLabels(["原始数据", "归一化结果"]) self.result_v_layout.addWidget(self.result_table) def manual_input(self): """ 手动输入数据 """ self.input_method_widget.hide() self.separator_widget.show() self.input_data_widget.show() self.input_data_edit.setFocus() def import_data(self): """ 导入数据 """ self.input_method_widget.hide() # 打开文件选择对话框 filename, _ = QFileDialog.getOpenFileName(self, "选择数据文件", os.path.expanduser("~"), "Excel 文件(*.xlsx)") if filename: try: # 读取 Excel 文件中的数据 data = pd.read_excel(filename) n_data = len(data) if n_data == 0: QMessageBox.warning(self, "警告", "数据文件为空!") else: # 显示结果区域 self.separator_widget.hide() self.input_data_widget.hide() self.result_widget.show() # 计算归一化结果 x_min = data.min() x_max = data.max() norm_data = (data - x_min) / (x_max - x_min) # 显示归一化结果 self.result_table.setRowCount(n_data) for i in range(n_data): self.result_table.setItem(i, 0, QTableWidgetItem(str(data.iloc[i, 0]))) self.result_table.setItem(i, 1, QTableWidgetItem(str(norm_data.iloc[i, 0]))) self.result_table.resizeColumnsToContents() except Exception as e: QMessageBox.critical(self, "错误", str(e)) return def calculate(self): """ 计算归一化结果 """ # 获取输入数据和区分符 data_str = self.input_data_edit.text() separator = str(self.separator_edit.text()).strip() if not separator: separator = "," # 将输入数据转换为数组 try: data = np.array([float(x) for x in data_str.split(separator)]) except Exception as e: QMessageBox.critical(self, "错误", "输入数据格式错误!") return n_data = len(data) if n_data == 0: QMessageBox.warning(self, "警告", "输入数据为空!") else: # 显示结果区域 self.separator_widget.hide() self.input_data_widget.hide() self.result_widget.show() # 计算归一化结果 x_min = np.min(data) x_max = np.max(data) norm_data = (data - x_min) / (x_max - x_min) # 显示归一化结果 self.result_table.setRowCount(n_data) for i in range(n_data): self.result_table.setItem(i, 0, QTableWidgetItem(str(data[i]))) self.result_table.setItem(i, 1, QTableWidgetItem(str(norm_data[i]))) self.result_table.resizeColumnsToContents() def closeEvent(self, event): """ 关闭窗口的事件 """ reply = QMessageBox.question(self, '退出', '确定要退出程序吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) win = Normalization() win.show() sys.exit(app.exec_()) ``` 这个程序使用 PyQt5 模块创建了一个 GUI 界面,包含了两种输入方式:手动输入和按照模板导入数据。在手动输入模式下,用户需要输入多个数据,用一个区分符(默认为逗号)分隔,按回车键结束输入。在按照模板导入数据模式下,用户需要选择一个 Excel 文件,程序会自动读取文件中的数据并计算归一化结果。 在程序运行,用户可以通过菜单栏中的“文件”选项卡选择“打包为 EXE 文件”来打包成可执行文件。这个过程需要使用 PyInstaller 工具,并且需要根据操作系统类型(Windows、Linux 或 macOS)选择相应的命令行参数。下面是一个 Windows 平台下的打包命令示例: ```bash pyinstaller main.py --onefile --windowed --icon=icon.ico ``` 其中,`main.py` 是主程序文件名,`--onefile` 表示将所有文件打包成一个单独的可执行文件,`--windowed` 表示隐藏命令行窗口,`--icon` 参数可以指定程序的图标文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值