使用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库。 这样,用户可以通过工具栏按钮方便地执行导入、划分等级、导出、清除和退出操作,并且每个按钮都有相应的提示功能。所有工具栏按钮的逻辑功能都已实现并能正确响应。
...全文
139 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
允许二次开发,允许商用

8

社区成员

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

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