使用wxpython的子模块wx.lib.agw.aui实现学生成绩自动划分等级导入导出excel表格的小程序,IDE运行和调试通过

传奇开心果编程
优质创作者: python技术领域
2024-09-12 16:50:45

img

img

源代码传奇开心果IDE运行和调试通过



import wx
import wx.grid as gridlib
import pandas as pd
import wx.lib.agw.aui as aui

class ExcelGridFrame(wx.Frame):
    def __init__(self, parent, title):
        super(ExcelGridFrame, self).__init__(parent, title=title, size=(600, 400))

        self.mgr = aui.AuiManager(self)

        # Initialize data frame
        self.df = pd.DataFrame()

        # 创建主面板和网格
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        self.grid = gridlib.Grid(panel)
        self.grid.CreateGrid(0, 5)  # 初始创建5列但没有行
        self.grid.SetColLabelValue(0, "学号")
        self.grid.SetColLabelValue(1, "姓名")
        self.grid.SetColLabelValue(2, "学科")
        self.grid.SetColLabelValue(3, "成绩")
        self.grid.SetColLabelValue(4, "等级")

        vbox.Add(self.grid, 1, wx.EXPAND | wx.ALL, 5)

        # 添加菜单栏
        menubar = wx.MenuBar()
        operationMenu = wx.Menu()
        
        importItem = operationMenu.Append(wx.ID_OPEN, '&导入\tCtrl+I', '导入Excel文件')
        categorizeItem = operationMenu.Append(wx.ID_ANY, '&划分等级\tCtrl+C', '划分成绩等级')
        exportItem = operationMenu.Append(wx.ID_SAVE, '&导出\tCtrl+E', '导出Excel文件')
        clearItem = operationMenu.Append(wx.ID_ANY, '&清除\tCtrl+L', '清除所有数据')
        operationMenu.AppendSeparator()
        exitItem = operationMenu.Append(wx.ID_EXIT, '&退出\tCtrl+Q', '退出程序')
        
        menubar.Append(operationMenu, '&操作')

        aboutMenu = wx.Menu()
        aboutItem = aboutMenu.Append(wx.ID_ABOUT, '&关于\tCtrl+A', '关于程序')
        menubar.Append(aboutMenu, '&帮助')

        self.SetMenuBar(menubar)

        # 创建工具栏
        toolbar = self.CreateToolBar()
        importTool = toolbar.AddTool(wx.ID_OPEN, '导入', wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN), shortHelp="导入Excel文件")
        categorizeTool = toolbar.AddTool(wx.ID_ANY, '划分等级', wx.ArtProvider.GetBitmap(wx.ART_EXECUTABLE_FILE), shortHelp="划分成绩等级")
        exportTool = toolbar.AddTool(wx.ID_SAVE, '导出', wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE), shortHelp="导出Excel文件")
        clearTool = toolbar.AddTool(wx.ID_ANY, '清除', wx.ArtProvider.GetBitmap(wx.ART_DELETE), shortHelp="清除所有数据")
        toolbar.AddSeparator()
        exitTool = toolbar.AddTool(wx.ID_EXIT, '退出', wx.ArtProvider.GetBitmap(wx.ART_QUIT), shortHelp="退出程序")
        toolbar.Realize()

        panel.SetSizer(vbox)
        self.mgr.AddPane(panel, aui.AuiPaneInfo().CenterPane())
        self.mgr.Update()

        # 绑定事件处理
        self.Bind(wx.EVT_MENU, self.OnImportExcel, importItem)
        self.Bind(wx.EVT_MENU, self.OnCategorizeGrades, categorizeItem)
        self.Bind(wx.EVT_MENU, self.OnExportExcel, exportItem)
        self.Bind(wx.EVT_MENU, self.OnClear, clearItem)
        self.Bind(wx.EVT_MENU, self.OnExit, exitItem)
        self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)

        self.Bind(wx.EVT_TOOL, self.OnImportExcel, importTool)
        self.Bind(wx.EVT_TOOL, self.OnCategorizeGrades, categorizeTool)
        self.Bind(wx.EVT_TOOL, self.OnExportExcel, exportTool)
        self.Bind(wx.EVT_TOOL, self.OnClear, clearTool)
        self.Bind(wx.EVT_TOOL, self.OnExit, exitTool)

    def OnImportExcel(self, event):
        with wx.FileDialog(self, "选择Excel文件", wildcard="Excel files (*.xlsx)|*.xlsx",
                           style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:

            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return

            pathname = fileDialog.GetPath()
            try:
                self.df = pd.read_excel(pathname)
                
                # 清空网格
                self.grid.ClearGrid()
                
                # 确保正确的行数
                if self.grid.GetNumberRows() < len(self.df.index):
                    self.grid.AppendRows(len(self.df.index) - self.grid.GetNumberRows())
                elif self.grid.GetNumberRows() > len(self.df.index):
                    self.grid.DeleteRows(0, self.grid.GetNumberRows() - len(self.df.index))

                # 填充数据
                for row in range(len(self.df.index)):
                    for col in range(4):  # 只填充前四列
                        val = str(self.df.iat[row, col])
                        self.grid.SetCellValue(row, col, val)

            except Exception as e:
                wx.LogError(f"无法打开文件 '{pathname}'.\n错误信息: {e}")

    def OnCategorizeGrades(self, event):
        if self.df.empty:
            wx.MessageBox("请先导入Excel文件", "提示", wx.OK | wx.ICON_INFORMATION)
            return

        # 根据成绩划分等级
        self.df["等级"] = self.df["成绩"].apply(self.categorize_grade)

        # 填充等级列
        for row in range(len(self.df.index)):
            self.grid.SetCellValue(row, 4, self.df.iat[row, 4])

    def categorize_grade(self, score):
        if score >= 90:
            return "优秀"
        elif score >= 80:
            return "良好"
        elif score >= 70:
            return "中等"
        elif score >= 60:
            return "及格"
        else:
            return "不及格"

    def OnExportExcel(self, event):
        if self.df.empty:
            wx.MessageBox("请先导入并划分等级", "提示", wx.OK | wx.ICON_INFORMATION)
            return

        with wx.FileDialog(self, "保存Excel文件", wildcard="Excel files (*.xlsx)|*.xlsx",
                           style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:

            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return

            pathname = fileDialog.GetPath()
            try:
                # 导出DataFrame到Excel
                self.df.to_excel(pathname, index=False)
                wx.MessageBox(f"文件已成功保存为 '{pathname}'", "信息", wx.OK | wx.ICON_INFORMATION)
            except Exception as e:
                wx.LogError(f"无法保存文件 '{pathname}'.\n错误信息: {e}")

    def OnClear(self, event):
        # 清空DataFrame和网格控件
        self.df = pd.DataFrame()
        self.grid.ClearGrid()
        if self.grid.GetNumberRows() > 0:
            self.grid.DeleteRows(0, self.grid.GetNumberRows())

    def OnExit(self, event):
        self.Close()  # 关闭窗口

    def OnAbout(self, event):
        wx.MessageBox("这是一个学生成绩Excel表格导入,然后划分成绩等级,最后导出结果的小程序。\n作者:传奇开心果", "关于", wx.OK | wx.ICON_INFORMATION)

class MyApp(wx.App):
    def OnInit(self):
        frame = ExcelGridFrame(None, "学生成绩等级自动划分导入导出小程序")
        frame.Show()
        return True

app = MyApp()
app.MainLoop()


关键部分说明:

  1. 工具栏按钮提示:在创建工具栏按钮时,使用shortHelp参数设置提示文本。例如,导入按钮的提示文本为“导入Excel文件”,划分等级按钮的提示文本为“划分成绩等级”,导出按钮的提示文本为“导出Excel文件”,清除按钮的提示文本为“清除所有数据”,退出按钮的提示文本为“退出程序”。
  2. 事件绑定:确保每个菜单项和工具栏按钮都正确绑定到相应的事件处理函数。例如,导入按钮绑定到OnImportExcel,划分等级按钮绑定到OnCategorizeGrades,导出按钮绑定到OnExportExcel,清除按钮绑定到OnClear,退出按钮绑定到OnExit。
  3. 事件处理函数:每个事件处理函数都实现了其对应的功能。例如,OnImportExcel读取Excel文件并填充数据到网格中,OnCategorizeGrades根据成绩划分等级并填充到网格中,OnExportExcel将数据导出为Excel文件,OnClear清空数据,OnExit关闭窗口。 请确保在运行这个程序之前,安装所需的pandas库和openpyxl库。 这样,用户可以通过工具栏按钮方便地执行导入、划分等级、导出、清除和退出操作,并且每个按钮都有相应的提示功能。所有工具栏按钮的逻辑功能都已实现并能正确响应。
...全文
556 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
允许二次开发,允许商用
内容概要:本文深入探讨了DMA高效数据传输实现方案在高性能计算芯片领域的应用与架构创新,重点分析了缓存一致性DMA、多通道DMA架构及其在数据中心SmartNIC、存算一体芯片和Chiplet互连等场景中的实践。文章结合RISC-V架构,通过Chisel硬件描述语言和C语言驱动代码,展示了多通道DMA控制器的设计与实现,涵盖仲裁机制、AXI总线适配、分散-聚集传输模式及中断处理等核心技术,并强调了性能优化与验证方法。最后展望了AI调度、光互连、近存计算与安全DMA等未来发展方向。; 适合人群:具备数字电路与计算机体系结构基础,从事芯片设计、嵌入式开发或高性能计算相关工作的研发人员,尤其是有1-5年经验的工程师与研究人员。; 使用场景及目标:①理解DMA在突破“内存墙”和降低系统能耗中的关键技术路径;②掌握多通道DMA控制器的硬件设计与驱动开发方法;③应用于SmartNIC、AI加速器、Chiplet等高性能芯片系统的数据传输架构设计;④为构建高带宽、低延迟、高能效的异构计算平台提供参考。; 阅读建议:此资源融合硬件设计与软件驱动,建议结合Chisel仿真与RISC-V平台实操,重点关注DMA与缓存一致性、异构计算单元的协同机制,并通过性能计数器与错误注入手段进行系统级验证。
内容概要:本文围绕基于共享储能服务的智能楼宇双层优化配置展开研究,通过Matlab代码实现相应的数学建模与仿真分析,提出一种结合上层规划与下层运行的协同优化框架,旨在提升智能楼宇能源系统的经济性、能效水平与电网互动能力。研究充分考虑光伏发电、负荷需求、储能充放电等多元因素,采用先进的优化算法(如智能优化算法)对共享储能资源的容量配置与运行调度进行精细化决策,有效降低用能成本,提高可再生能源消纳率,并增强系统运行的稳定性与灵活性。全文涵盖模型构建、算法设计、求解流程及结果验证,具备较高的理论深度与工程应用价值; 适合人群:具备电力系统、能源管理、优化算法等相关背景的科研人员、研究生,以及从事智能电网、综合能源系统、建筑节能等领域的工程技术人员; 使用场景及目标:①用于智能楼宇及园区级能源系统的规划与运行优化研究;②支撑共享储能机制下的资源配置、经济调度与商业模式设计;③作为Matlab仿真教学与高水平论文复现的典型案例,帮助深入理解双层优化模型、主从博弈结构及智能算法在能源系统中的应用; 阅读建议:建议结合提供的Matlab代码进行同步学习与调试,重点关注上下层模型的耦合关系与迭代求解过程,可进一步拓展至多主体协同、不确定性建模(如风光出力波动)及鲁棒优化等前沿方向开展深化研究。
内容概要:本文《【故障检测】基于 KPCA 的故障检测【T2 和 Q 统计指数的可视化】(Matlab代码实现)》系统阐述了基于核主成分分析(KPCA)的非线性故障检测方法,重点实现了T²和Q统计量的构建与可视化过程。通过Matlab编程,将高维非线性数据映射至特征空间,提取主成分并建立监控模型,利用T²和Q指数对工业过程中的异常状态进行联合监测与诊断,有效提升了复杂系统中早期故障的识别能力,具有较强的工程实用性与理论参考价值。; 适合人群:适用于具备信号处理、控制工程或工业过程监测背景,熟悉Matlab编程语言,并从事故障诊断、智能运维、自动化系统研发等相关工作的研究生、科研人员及工程技术开发者。; 使用场景及目标:①应用于化工、电力、制造等流程工业中的关键设备状态监控与早期故障预警;②作为学术研究中KPCA算法的仿真验证平台,用于对比分析不同非线性降维方法的检测性能;③深化对非线性过程监控中统计指标设计与阈值判定机制的理解与实践应用。; 阅读建议:建议读者结合所提供的Matlab代码逐模块运行调试,深入掌握KPCA建模流程、主成分空间划分及T²、Q统计量的计算逻辑,鼓励在标准数据集(如TE过程)上复现实验结果,并尝试扩展至其他非线性场景以提升模型泛化能力。

8

社区成员

发帖
与我相关
我的任务
社区描述
软件开发那些事
软件工程需求分析团队开发 个人社区 甘肃省·酒泉市
社区管理员
  • 传奇开心果编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧