8
社区成员




源代码传奇开心果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()
关键部分说明: