4月21日.零点

博主完成音乐管理系统前台部分框架,大部分功能已实现,后续需处理会员资料管理等细节,因无现成界面,设计或耗时。若不出问题,本周可挂服务器,之后打算写“音乐小偷”,还计划升级“软件下载管理系统”及写企业管理软件。

今天晚上再忙了一晚.终于把音乐管理系统的前台部分框架给弄出来啦.现在已经完成大部分功能.接下来的就是细节问题.如会员资料管理.会员音乐盒等等.这几部分因没有现成的界面.还要自己再设计界面.所以可能要花费较多时间.唉,谁叫自己的设计水平太差啦.

如果不出其它问题的,这个星期大概可以挂上服务器..呵呵.接下来的就是写"音乐小偷"咯.不可能自己手功去加音乐歌曲数据吧?那不累死我才怪.我可不喜欢做这些无聊乏味的事.我很懒的.写小偷应该很容易的.

弄完这个站.打算把"软件下载管理系统"再升级修改一遍.等忙完这个再打算写一个企业管理软件.啊啊..想得太远啦..哈哈...慢慢来慢慢来...现在很累...睡一会吧....

import tkinter as tk from tkinter import ttk, messagebox from tkcalendar import DateEntry import sqlite3 import datetime import os import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg class EnergyManagementSystem: def __init__(self, root): self.root = root self.root.title("企业能源管理系统") self.root.geometry("1200x800") self.root.state('zoomed') # 最大化窗口 # 数据库初始化 self.db_conn = sqlite3.connect('energy_management.db') self.create_tables() # 当前用户和期 self.current_user = "管理员" self.current_date = datetime.date.today() # 数据存储结构 self.run_data = { 'basic_info': {}, 'old_grid': {}, 'new_grid': {}, 'electricity': {}, 'fuel': {}, 'water': {}, 'start_stop': {}, 'environment': {}, 'defect': {}, 'plan': {} } self.energy_saving_data = {} self.device_reliability_data = {} # 创建UI组件 self.create_toolbar() self.create_sidebar() self.create_content_frame() # 状态更新 self.update_status("系统就绪") def create_tables(self): """创建数据库表结构""" cursor = self.db_conn.cursor() # 运行数据表 cursor.execute(''' CREATE TABLE IF NOT EXISTS run_data ( id INTEGER PRIMARY KEY, date TEXT NOT NULL, shift TEXT, weather TEXT, energy_saving_measures TEXT, gen_elec_old TEXT, -- JSON格式存储旧表数据 gen_elec_new TEXT, -- JSON格式存储新表数据 electricity TEXT, -- JSON格式存储电量数据 fuel TEXT, -- JSON格式存储燃料数据 water TEXT, -- JSON格式存储水耗数据 start_stop TEXT, -- JSON格式存储启停数据 environment TEXT, -- JSON格式存储环保数据 defect TEXT, -- JSON格式存储缺陷数据 plan TEXT -- JSON格式存储计划数据 ) ''') # 节能数据表 cursor.execute(''' CREATE TABLE IF NOT EXISTS energy_saving ( id INTEGER PRIMARY KEY, date TEXT NOT NULL, ac_units_11_13 INTEGER, ac_hours REAL, unit11_fuel_pump REAL, unit11_aux_pump REAL, unit11_jacking_pump REAL, unit13_cond_pump REAL, unit13_closed_pump REAL, unit13_demineral_pump REAL, unit13_vacuum_filter REAL, unit13_fan REAL, total_saving REAL ) ''') # 设备可靠性表 cursor.execute(''' CREATE TABLE IF NOT EXISTS device_reliability ( id INTEGER PRIMARY KEY, device_name TEXT NOT NULL, stop_date TEXT, stop_time TEXT, status TEXT, start_date TEXT, start_time TEXT ) ''') self.db_conn.commit() def create_toolbar(self): """创建顶部工具栏""" toolbar = ttk.Frame(self.root, padding=10) toolbar.pack(side=tk.TOP, fill=tk.X) # 1. 期标签 ttk.Label(toolbar, text="📅 期").pack(side=tk.LEFT, padx=5) # 2. 期选择 self.date_var = tk.StringVar(value=self.current_date.strftime("%Y-%m-%d")) date_entry = DateEntry( toolbar, name="tool_date", date_pattern="y-mm-dd", textvariable=self.date_var ) date_entry.pack(side=tk.LEFT, padx=5) date_entry.bind("<<DateEntrySelected>>", self.on_date_changed) # 3. 保存按钮 ttk.Button( toolbar, text="💾 保存", command=self.save_all_data ).pack(side=tk.LEFT, padx=5) # 4-8. 功能按钮 buttons = [ ("🔍 查询", lambda: self.show_content("数据查询")), ("📊 分析", lambda: self.show_content("智能分析")), ("🔄 刷新", self.refresh_data), ("📤 导出", self.export_daily), ("📈 趋势图", self.plot_30d) ] for text, cmd in buttons: ttk.Button(toolbar, text=text, command=cmd).pack(side=tk.LEFT, padx=5) # 9. 状态标签 self.status_var = tk.StringVar(value="就绪") ttk.Label( toolbar, name="status_label", textvariable=self.status_var ).pack(side=tk.RIGHT, padx=10) # 10. 用户标签 ttk.Label( toolbar, name="user_label", text=f"用户: {self.current_user}" ).pack(side=tk.RIGHT, padx=10) def create_sidebar(self): """创建左侧功能菜单""" sidebar = ttk.Frame(self.root, width=200, style="sidebar.TFrame") sidebar.pack(side=tk.LEFT, fill=tk.Y, padx=5, pady=5) # 功能按钮 functions = [ ("运行数据录入", "运行数据录入"), ("节能数据录入", "节能数据录入"), ("设备可靠性数据录入", "设备可靠性"), ("智能分析", "智能分析"), ("数据查询", "数据查询") ] for text, content in functions: btn = ttk.Button( sidebar, text=text, style="sidebar.TButton", command=lambda c=content: self.show_content(c) ) btn.pack(fill=tk.X, pady=2) # 16. 分隔线 ttk.Separator(sidebar, orient=tk.HORIZONTAL).pack(fill=tk.X, pady=10) # 系统菜单 sys_menu = ttk.Button(sidebar, text="系统菜单", style="sidebar.TButton") sys_menu.pack(fill=tk.X, pady=2) sys_menu.bind("<Button-1>", self.show_system_menu) def create_content_frame(self): """创建内容区域""" self.content_frame = ttk.Frame(self.root) self.content_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 默认显示运行数据录入 self.show_content("运行数据录入") def show_content(self, content_name): """显示指定内容区域""" # 清除当前内容 for widget in self.content_frame.winfo_children(): widget.destroy() # 根据内容名称显示相应界面 if content_name == "运行数据录入": self.create_run_data_input() elif content_name == "节能数据录入": self.create_energy_saving_input() elif content_name == "设备可靠性": self.create_device_reliability() elif content_name == "智能分析": self.create_analysis() elif content_name == "数据查询": self.create_data_query() else: ttk.Label(self.content_frame, text=content_name).pack() def create_run_data_input(self): """创建运行数据录入界面""" notebook = ttk.Notebook(self.content_frame) notebook.pack(fill=tk.BOTH, expand=True) # 基本信息帧 basic_frame = ttk.LabelFrame(notebook, text="基本信息") notebook.add(basic_frame, text="基本信息") self.create_basic_info(basic_frame) # 发电机组电量(旧表) old_grid_frame = ttk.LabelFrame(notebook, text="发电机组电量(旧表)") notebook.add(old_grid_frame, text="旧表电量") self.create_old_grid(old_grid_frame) # 发电机组电量(新表) new_grid_frame = ttk.LabelFrame(notebook, text="发电机组电量(新表)") notebook.add(new_grid_frame, text="新表电量") self.create_new_grid(new_grid_frame) # 其他区块类似实现... # 89. 保存全部按钮 save_btn = ttk.Button( self.content_frame, text="保存运行数据", style="Accent.TButton", command=self.save_run_data ) save_btn.pack(pady=10) def create_basic_info(self, frame): """创建基本信息区块""" # 17. 期标签 ttk.Label(frame, text="期").grid(row=0, column=0, padx=5, pady=5, sticky=tk.W) # 18. 期输入 self.run_data['basic_info']['date'] = tk.StringVar(value=self.current_date.strftime("%Y-%m-%d")) date_entry = DateEntry( frame, name="run_basic_date", textvariable=self.run_data['basic_info']['date'] ) date_entry.grid(row=0, column=1, padx=5, pady=5) date_entry.bind("<<DateEntrySelected>>", self.fill_prev_data_thread) # 19. 班次标签 ttk.Label(frame, text="班次").grid(row=1, column=0, padx=5, pady=5, sticky=tk.W) # 20. 班次下拉 self.run_data['basic_info']['shift'] = tk.StringVar() shift_combo = ttk.Combobox( frame, name="run_shift", textvariable=self.run_data['basic_info']['shift'], values=["早", "中", "夜"], state="readonly" ) shift_combo.grid(row=1, column=1, padx=5, pady=5) shift_combo.current(0) # 21. 天气标签 ttk.Label(frame, text="天气").grid(row=2, column=0, padx=5, pady=5, sticky=tk.W) # 22. 天气输入 self.run_data['basic_info']['weather'] = tk.StringVar() ttk.Entry( frame, name="run_weather", textvariable=self.run_data['basic_info']['weather'] ).grid(row=2, column=1, padx=5, pady=5, sticky=tk.W) # 23. 节能措施标签 ttk.Label(frame, text="节能措施、事件").grid(row=3, column=0, padx=5, pady=5, sticky=tk.W) # 24. 节能措施输入 self.run_data['basic_info']['energy_saving_measures'] = tk.StringVar() ttk.Entry( frame, name="run_measures", width=80, textvariable=self.run_data['basic_info']['energy_saving_measures'] ).grid(row=3, column=1, padx=5, pady=5, sticky=tk.W) # 保存基本信息按钮 ttk.Button( frame, text="保存基本信息", command=lambda: self.save_run_data_section('basic_info') ).grid(row=4, column=1, padx=5, pady=10, sticky=tk.E) def create_old_grid(self, frame): """创建发电机组电量(旧表)区块""" # 关口点列表 points = [ "220kV洋干Ⅰ线(正)", "220kV洋干Ⅰ线(反)", "220kV洋三线(正)", "220kV洋三线(反)", "220kV洋石线(正)", "220kV洋石线(反)", "132kV厂站1#线", "132kV厂站2#线" ] # 创建表格标题 headers = ["序号", "关口点名称", "CT", "PT", "零点底数", "解列后底数", "并网前底数", "24点底数", "合成倍率", "本电量", "本月累计电量"] for col, header in enumerate(headers): ttk.Label(frame, text=header, font=('SimHei', 10, 'bold')).grid(row=0, column=col, padx=2, pady=2) # 创建数据行 for row, point in enumerate(points, start=1): # 序号 ttk.Label(frame, text=str(row)).grid(row=row, column=0, padx=2, pady=2) # 关口点名称 ttk.Label(frame, text=point).grid(row=row, column=1, padx=2, pady=2) # CT和PT根据电压等级确定 ct_text = "800/5" if "220kV" in point else "300/5" pt_text = "220/100" if "220kV" in point else "110/100" ttk.Label(frame, text=ct_text).grid(row=row, column=2, padx=2, pady=2) ttk.Label(frame, text=pt_text).grid(row=row, column=3, padx=2, pady=2) # 倍率 rate = 352000 if "220kV" in point else 6600 ttk.Label(frame, text=str(rate)).grid(row=row, column=8, padx=2, pady=2) # 创建输入字段 for col_idx, field in enumerate(["零点底数", "解列后底数", "并网前底数", "24点底数"], start=4): var_name = f"gen_elec_old{point[:3]}_{field}" self.run_data['old_grid'][var_name] = tk.DoubleVar() entry = ttk.Entry( frame, width=10, textvariable=self.run_data['old_grid'][var_name] ) entry.grid(row=row, column=col_idx, padx=2, pady=2) entry.bind("<FocusOut>", lambda e, p=point: self.calculate_energy(p, "old")) # 本电量显示 daily_var = f"gen_elec_old{point[:3]}_daily" self.run_data['old_grid'][daily_var] = tk.StringVar(value="0.00") ttk.Label( frame, textvariable=self.run_data['old_grid'][daily_var] ).grid(row=row, column=9, padx=2, pady=2) # 本月累计显示 monthly_var = f"gen_elec_old{point[:3]}_monthly" self.run_data['old_grid'][monthly_var] = tk.StringVar(value="0.00") ttk.Label( frame, textvariable=self.run_data['old_grid'][monthly_var] ).grid(row=row, column=10, padx=2, pady=2) # 上网电量计算 ttk.Label(frame, text="主表上网电量").grid(row=9, column=0, columnspan=9, sticky=tk.E) self.run_data['old_grid']['main_daily'] = tk.StringVar(value="0.00") ttk.Entry( frame, textvariable=self.run_data['old_grid']['main_daily'], state='readonly' ).grid(row=9, column=9, padx=2, pady=2) # 保存按钮 ttk.Button( frame, text="保存旧表电量", command=lambda: self.save_run_data_section('old_grid') ).grid(row=10, column=10, padx=5, pady=10, sticky=tk.E) def create_new_grid(self, frame): """创建发电机组电量(新表)区块""" # 实现类似旧表,但使用不同的变量前缀 # 具体实现省略,结构同旧表 ttk.Label(frame, text="新表电量实现类似旧表").pack(pady=20) def create_energy_saving_input(self): """创建节能数据录入界面""" container = ttk.Frame(self.content_frame) container.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 电子间空调区块 ac_frame = ttk.LabelFrame(container, text="电子间空调") ac_frame.pack(fill=tk.X, padx=5, pady=5) # 90. 空调台数 ttk.Label(ac_frame, text="空调台数:").grid(row=0, column=0, padx=5, pady=5) self.energy_saving_data['ac_units_11_13'] = tk.IntVar(value=0) ttk.Entry( ac_frame, width=10, textvariable=self.energy_saving_data['ac_units_11_13'] ).grid(row=0, column=1, padx=5, pady=5) # 91. 空调时长 ttk.Label(ac_frame, text="运行时长(小时):").grid(row=0, column=2, padx=5, pady=5) self.energy_saving_data['ac_hours'] = tk.DoubleVar(value=0.0) ttk.Entry( ac_frame, width=10, textvariable=self.energy_saving_data['ac_hours'] ).grid(row=0, column=3, padx=5, pady=5) # 92. 空调节能量显示 self.energy_saving_data['ac_energy_11_13'] = tk.StringVar(value="0.00") ttk.Label(ac_frame, text="节能量:").grid(row=0, column=4, padx=5, pady=5) ttk.Label( ac_frame, textvariable=self.energy_saving_data['ac_energy_11_13'] ).grid(row=0, column=5, padx=5, pady=5) # 绑定计算 for var in [self.energy_saving_data['ac_units_11_13'], self.energy_saving_data['ac_hours']]: var.trace_add("write", self.calculate_ac_energy) # 其他机组区块类似实现... # 总节能量 total_frame = ttk.Frame(container) total_frame.pack(fill=tk.X, padx=5, pady=10) ttk.Label(total_frame, text="总节能量:").grid(row=0, column=0, padx=5, pady=5) self.energy_saving_data['total_saving'] = tk.StringVar(value="0.00") ttk.Entry( total_frame, width=15, textvariable=self.energy_saving_data['total_saving'], state='readonly' ).grid(row=0, column=1, padx=5, pady=5) # 107. 保存节能大按钮 save_btn = ttk.Button( container, text="保存节能数据", command=self.save_energy_saving_data ) save_btn.pack(pady=10) def create_device_reliability(self): """创建设备可靠性界面""" frame = ttk.Frame(self.content_frame) frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 108. 设备选择标签 ttk.Label(frame, text="选择设备:").grid(row=0, column=0, padx=5, pady=5, sticky=tk.W) # 设备列表 devices = [ "#11燃机", "#12燃机", "#13燃机", "#14燃机", "#11汽机", "#12汽机", "#13汽机", "#14汽机", "主变压器", "厂用变压器", "高压开关柜", "低压开关柜", "直流系统", "UPS系统", "刀闸统计表" ] self.device_var = tk.StringVar() device_combo = ttk.Combobox( frame, textvariable=self.device_var, values=devices, state="readonly", width=20 ) device_combo.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W) device_combo.current(0) # 109. 添加记录按钮 ttk.Button( frame, text="添加记录", command=self.add_device_record ).grid(row=0, column=2, padx=5, pady=5) # 记录表格 columns = ("序号", "设备名称", "停止时间", "设备状态", "启动时间", "持续时间") self.reliability_tree = ttk.Treeview( frame, columns=columns, show="headings", height=10 ) for col in columns: self.reliability_tree.heading(col, text=col) self.reliability_tree.column(col, width=100) self.reliability_tree.grid(row=1, column=0, columnspan=3, padx=5, pady=5, sticky=tk.NSEW) # 110. 删除选中按钮 ttk.Button( frame, text="删除选中", command=self.delete_selected_record ).grid(row=2, column=0, padx=5, pady=5) # 111. 保存可靠性按钮 ttk.Button( frame, text="保存数据", command=self.save_reliability_data ).grid(row=2, column=2, padx=5, pady=5, sticky=tk.E) def create_data_query(self): """创建数据查询界面""" notebook = ttk.Notebook(self.content_frame) notebook.pack(fill=tk.BOTH, expand=True) # 运行数据查询 run_frame = ttk.Frame(notebook) notebook.add(run_frame, text="运行数据查询") self.create_run_data_query(run_frame) # 可靠性数据查询 rel_frame = ttk.Frame(notebook) notebook.add(rel_frame, text="可靠性数据查询") self.create_reliability_query(rel_frame) # 节能数据查询 energy_frame = ttk.Frame(notebook) notebook.add(energy_frame, text="节能数据查询") self.create_energy_query(energy_frame) def create_run_data_query(self, frame): """创建运行数据查询页面""" # 查询条件 filter_frame = ttk.Frame(frame) filter_frame.pack(fill=tk.X, padx=10, pady=10) ttk.Label(filter_frame, text="期范围:").pack(side=tk.LEFT, padx=5) self.query_start_var = tk.StringVar() start_entry = DateEntry(filter_frame, textvariable=self.query_start_var) start_entry.pack(side=tk.LEFT, padx=5) ttk.Label(filter_frame, text="至").pack(side=tk.LEFT, padx=5) self.query_end_var = tk.StringVar() end_entry = DateEntry(filter_frame, textvariable=self.query_end_var) end_entry.pack(side=tk.LEFT, padx=5) # 114. 查询按钮 ttk.Button( filter_frame, text="查询", command=self.query_run_data ).pack(side=tk.LEFT, padx=10) # 数据表格 columns = ("期", "班次", "天气", "节能措施", "主表电量", "副表电量") self.run_data_tree = ttk.Treeview( frame, columns=columns, show="headings", height=15 ) for col in columns: self.run_data_tree.heading(col, text=col) self.run_data_tree.column(col, width=120) self.run_data_tree.pack(fill=tk.BOTH, expand=True, padx=10, pady=5) # 分页控件 page_frame = ttk.Frame(frame) page_frame.pack(fill=tk.X, padx=10, pady=10) # 115. 分页按钮 page_buttons = [ ("首页", self.first_page), ("上一页", self.prev_page), ("下一页", self.next_page), ("末页", self.last_page) ] for text, cmd in page_buttons: ttk.Button(page_frame, text=text, command=cmd).pack(side=tk.LEFT, padx=5) self.page_var = tk.StringVar(value="1/1") ttk.Label(page_frame, textvariable=self.page_var).pack(side=tk.LEFT, padx=10) def create_analysis(self): """创建智能分析界面""" frame = ttk.Frame(self.content_frame) frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 116. 趋势图标题 ttk.Label( frame, text="趋势图分析", font=('SimHei', 14, 'bold') ).pack(pady=10) # 图表容器 fig = plt.figure(figsize=(10, 5)) self.canvas = FigureCanvasTkAgg(fig, master=frame) self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 117. 加载趋势按钮 ttk.Button( frame, text="加载30天趋势", command=self.load_30d_trend ).pack(pady=10) # ======================== 功能实现方法 ======================== def on_date_changed(self, event): """期变更事件处理""" self.current_date = datetime.datetime.strptime(self.date_var.get(), "%Y-%m-%d").date() self.update_status(f"期已变更为: {self.date_var.get()}") def save_all_data(self): """保存所有数据""" try: self.save_run_data() self.save_energy_saving_data() self.save_reliability_data() self.update_status("所有数据保存成功") except Exception as e: self.update_status(f"保存失败: {str(e)}", error=True) def refresh_data(self): """刷新数据""" self.fill_prev_data_thread() self.update_status("数据已刷新") def export_daily(self): """导出报表""" # 实现导出功能 self.update_status("报表已导出") def plot_30d(self): """绘制30天趋势图""" self.show_content("智能分析") self.load_30d_trend() def update_status(self, msg, error=False): """更新状态栏""" timestamp = datetime.datetime.now().strftime("%H:%M:%S") status = f"[{timestamp}] {msg}" self.status_var.set(status) if error: self.root.after(100, lambda: messagebox.showerror("错误", msg)) def calculate_energy(self, point, grid_type): """计算电量公式""" prefix = f"gen_elec_{grid_type}{point[:3]}_" try: # 获取输入值 zero_point = self.run_data[f"{grid_type}_grid"][f"{prefix}零点底数"].get() after_disconnect = self.run_data[f"{grid_type}_grid"][f"{prefix}解列后底数"].get() rate = 352000 if "220kV" in point else 6600 # 计算本电量 daily_energy = max(0, (after_disconnect - zero_point)) * rate self.run_data[f"{grid_type}_grid"][f"{prefix}daily"].set(f"{daily_energy:,.2f}") # 计算本月累计(简化实现) monthly_energy = daily_energy + 10000 # 实际应从数据库获取累计值 self.run_data[f"{grid_type}_grid"][f"{prefix}monthly"].set(f"{monthly_energy:,.2f}") except (ValueError, TypeError): self.run_data[f"{grid_type}_grid"][f"{prefix}daily"].set("0.00") self.run_data[f"{grid_type}_grid"][f"{prefix}monthly"].set("0.00") def calculate_ac_energy(self, *args): """计算空调节能量""" try: units = self.energy_saving_data['ac_units_11_13'].get() hours = self.energy_saving_data['ac_hours'].get() energy = units * 29 * hours self.energy_saving_data['ac_energy_11_13'].set(f"{energy:,.2f}") except (ValueError, TypeError): self.energy_saving_data['ac_energy_11_13'].set("0.00") def fill_prev_data_thread(self): """线程方式填充前一数据""" # 实际实现应从数据库获取前一天数据 self.update_status("正在加载前一天数据...") self.root.after(1000, lambda: self.update_status("前一天数据加载完成")) def save_run_data_section(self, section): """保存运行数据特定区块""" # 实际实现应保存到数据库 self.update_status(f"{section} 数据已保存") def save_run_data(self): """保存运行数据""" # 实际实现应保存所有运行数据到数据库 self.update_status("运行数据已保存") def save_energy_saving_data(self): """保存节能数据""" # 实际实现应保存节能数据到数据库 self.update_status("节能数据已保存") self.show_content("智能分析") # 打开分析窗口 def add_device_record(self): """添加设备记录""" # 弹出添加记录窗口 self.update_status("添加设备记录") def delete_selected_record(self): """删除选中记录""" selected = self.reliability_tree.selection() if not selected: self.update_status("请先选择记录", error=True) return if messagebox.askyesno("确认", "确定删除选中记录吗?"): for item in selected: self.reliability_tree.delete(item) self.update_status("选中记录已删除") def save_reliability_data(self): """保存可靠性数据""" # 实际实现应保存可靠性数据到数据库 self.update_status("可靠性数据已保存") def query_run_data(self): """查询运行数据""" # 实际实现应从数据库查询数据 self.update_status("正在查询运行数据...") # 模拟数据 data = [ ("2023-07-01", "早", "晴", "优化运行", "12500.25", "12480.50"), ("2023-07-02", "中", "多云", "设备维护", "12680.75", "12650.30"), ("2023-07-03", "夜", "小雨", "节能改造", "12450.60", "12420.45") ] # 清除现有数据 for item in self.run_data_tree.get_children(): self.run_data_tree.delete(item) # 填充新数据 for row in data: self.run_data_tree.insert("", tk.END, values=row) self.update_status("运行数据查询完成") def load_30d_trend(self): """加载30天趋势数据""" # 实际实现应从数据库获取数据 self.update_status("正在加载趋势数据...") # 模拟数据 dates = [f"2023-06-{i:02d}" for i in range(1, 31)] values = [10000 + i*100 + (i % 5)*500 for i in range(30)] # 绘制图表 fig = plt.figure() ax = fig.add_subplot(111) ax.plot(dates, values, 'b-o', linewidth=2) ax.set_title('30天发电量趋势', fontsize=14) ax.set_xlabel('期', fontsize=12) ax.set_ylabel('发电量 (万kWh)', fontsize=12) ax.grid(True, linestyle='--', alpha=0.7) plt.xticks(rotation=45) fig.tight_layout() # 更新图表 self.canvas.figure = fig self.canvas.draw() self.update_status("趋势图加载完成") def first_page(self): """跳转到首页""" self.page_var.set("1/5") self.query_run_data() def prev_page(self): """上一页""" current, total = map(int, self.page_var.get().split('/')) if current > 1: self.page_var.set(f"{current-1}/{total}") self.query_run_data() def next_page(self): """下一页""" current, total = map(int, self.page_var.get().split('/')) if current < total: self.page_var.set(f"{current+1}/{total}") self.query_run_data() def last_page(self): """末页""" current, total = map(int, self.page_var.get().split('/')) self.page_var.set(f"{total}/{total}") self.query_run_data() def show_content(self, content): """显示指定内容""" self.content_var.set(content) self.update_status(f"显示 {content}") 这段代码数据录入功能为什么没有框
最新发布
11-23
<think> 我们注意到用户的问题是关于代码中数据录入功能为什么没有框。在提供的代码中,确实有一些输入框被创建,但可能由于代码不完整或者某些部分被省略,导致用户没有看到完整的输入框。 具体来说,在`create_old_grid`方法中,我们为每个关口点的多个字段创建了输入框(Entry),例如“零点底数”、“解列后底数”等。这些输入框是使用`ttk.Entry`创建的,并且绑定到相应的变量。但是,在`create_new_grid`方法中,我们只是简单显示了一个标签,并没有实际创建输入框(因为代码中省略了具体实现,只写了`ttk.Label(frame, text="新表电量实现类似旧表")`)。 另外,在节能数据录入界面(`create_energy_saving_input`)中,我们为空调台数和空调时长创建了输入框,并且绑定了计算函数。 因此,可能用户指的是新表电量录入部分没有输入框?或者是因为在代码示例中,我们只实现了旧表电量录入的输入框,而新表电量录入部分被省略了?或者可能是其他部分? 但是,用户的问题描述比较简短,我们无法确定具体是哪个部分。为了解答用户的问题,我们可以: 1. 指出在运行数据录入的旧表电量部分是有输入框的,而新表电量部分我们暂时用标签代替(因为代码示例中省略了详细实现)。 2. 在节能数据录入部分,我们也有输入框。 因此,如果用户没有看到输入框,可能是因为在代码示例中,我们只实现了部分功能,而其他部分(如新表电量)被省略了。 为了完善代码,我们可以补充新表电量录入部分的输入框,其实现方式旧表电量类似。 以下是对`create_new_grid`方法的补充实现(旧表电量类似,但变量前缀不同): </think>您的观察非常准确。这段代码中数据录入功能确实缺少输入框(文本框),主要问题出在以下几个地方: ### 问题分析: 1. **`create_new_grid` 方法实现不完整**: ```python def create_new_grid(self, frame): """创建发电机组电量(新表)区块""" # 实现类似旧表,但使用不同的变量前缀 # 具体实现省略,结构同旧表 ttk.Label(frame, text="新表电量实现类似旧表").pack(pady=20) ``` 这里只是简单显示了一个标签,没有实际创建输入框。 2. **其他部分实现缺失**: ```python # 其他区块类似实现... ``` 代码注释中提到还有其他区块需要实现,但实际代码中缺失了这些实现。 3. **变量绑定问题**: 在 `create_old_grid` 方法中,虽然创建了输入框,但变量绑定使用的是 `tk.DoubleVar()`,这可能导致界面不显示输入框的问题。 ### 完整解决方案: 以下是修正后的完整实现,添加了缺失的输入框: ```python def create_new_grid(self, frame): """创建发电机组电量(新表)区块""" # 关口点列表 points = [ "220kV洋干Ⅰ线(正)", "220kV洋干Ⅰ线(反)", "220kV洋三线(正)", "220kV洋三线(反)", "220kV洋石线(正)", "220kV洋石线(反)", "132kV厂站1#线", "132kV厂站2#线" ] # 创建表格标题 headers = ["序号", "关口点名称", "CT", "PT", "零点底数", "解列后底数", "并网前底数", "24点底数", "合成倍率", "本电量", "本月累计电量"] for col, header in enumerate(headers): ttk.Label(frame, text=header, font=('SimHei', 10, 'bold')).grid(row=0, column=col, padx=2, pady=2) # 创建数据行 for row, point in enumerate(points, start=1): # 序号 ttk.Label(frame, text=str(row)).grid(row=row, column=0, padx=2, pady=2) # 关口点名称 ttk.Label(frame, text=point).grid(row=row, column=1, padx=2, pady=2) # CT和PT根据电压等级确定 ct_text = "800/5" if "220kV" in point else "300/5" pt_text = "220/100" if "220kV" in point else "110/100" ttk.Label(frame, text=ct_text).grid(row=row, column=2, padx=2, pady=2) ttk.Label(frame, text=pt_text).grid(row=row, column=3, padx=2, pady=2) # 倍率 rate = 352000 if "220kV" in point else 6600 ttk.Label(frame, text=str(rate)).grid(row=row, column=8, padx=2, pady=2) # 创建输入字段 - 使用StringVar而不是DoubleVar for col_idx, field in enumerate(["零点底数", "解列后底数", "并网前底数", "24点底数"], start=4): var_name = f"gen_elec_new{point[:3]}_{field}" self.run_data['new_grid'][var_name] = tk.StringVar() # 使用StringVar entry = ttk.Entry( frame, width=10, textvariable=self.run_data['new_grid'][var_name] ) entry.grid(row=row, column=col_idx, padx=2, pady=2) entry.bind("<FocusOut>", lambda e, p=point: self.calculate_energy(p, "new")) # 本电量显示 daily_var = f"gen_elec_new{point[:3]}_daily" self.run_data['new_grid'][daily_var] = tk.StringVar(value="0.00") ttk.Label( frame, textvariable=self.run_data['new_grid'][daily_var] ).grid(row=row, column=9, padx=2, pady=2) # 本月累计显示 monthly_var = f"gen_elec_new{point[:3]}_monthly" self.run_data['new_grid'][monthly_var] = tk.StringVar(value="0.00") ttk.Label( frame, textvariable=self.run_data['new_grid'][monthly_var] ).grid(row=row, column=10, padx=2, pady=2) # 上网电量计算 ttk.Label(frame, text="副表上网电量").grid(row=9, column=0, columnspan=9, sticky=tk.E) self.run_data['new_grid']['backup_daily'] = tk.StringVar(value="0.00") ttk.Entry( frame, textvariable=self.run_data['new_grid']['backup_daily'], state='readonly' ).grid(row=9, column=9, padx=2, pady=2) # 保存按钮 ttk.Button( frame, text="保存新表电量", command=lambda: self.save_run_data_section('new_grid') ).grid(row=10, column=10, padx=5, pady=10, sticky=tk.E) ``` ### 关键修正点: 1. **使用 `StringVar` 替代 `DoubleVar`**: ```python self.run_data['new_grid'][var_name] = tk.StringVar() # 使用StringVar ``` 使用 `DoubleVar` 可能导致某些情况下输入框不显示,特别是当值被设为0.0时 2. **完整实现表格结构**: 添加了旧表区块相同的表格结构,包括所有必要的输入框和标签 3. **绑定计算函数**: ```python entry.bind("<FocusOut>", lambda e, p=point: self.calculate_energy(p, "new")) ``` 在焦点离开输入框时自动计算电量 4. **添加保存按钮**: ```python ttk.Button(frame, text="保存新表电量", ...).grid(...) ``` 添加专用的保存按钮 ### 其他区块的类似实现: 对于其他缺失的区块(如电量、燃料、水耗等),应采用类似的模式实现: ```python def create_electricity_input(self, frame): """创建电量输入区块""" # 创建表格结构 headers = ["设备", "零点读数", "24点读数", "倍率", "当用量"] # 设备列表 devices = ["#11燃机", "#11汽机", "#13燃机", "#13汽机", "厂用电"] for row, device in enumerate(devices): # 设备名称 ttk.Label(frame, text=device).grid(row=row, column=0, padx=5, pady=5) # 零点读数输入框 start_var = f"elec_{device}_start" self.run_data['electricity'][start_var] = tk.StringVar() ttk.Entry(frame, textvariable=self.run_data['electricity'][start_var]).grid(row=row, column=1, padx=5, pady=5) # 24点读数输入框 end_var = f"elec_{device}_end" self.run_data['electricity'][end_var] = tk.StringVar() ttk.Entry(frame, textvariable=self.run_data['electricity'][end_var]).grid(row=row, column=2, padx=5, pady=5) # 倍率 rate_var = f"elec_{device}_rate" self.run_data['electricity'][rate_var] = tk.StringVar(value="1.0") ttk.Label(frame, textvariable=self.run_data['electricity'][rate_var]).grid(row=row, column=3, padx=5, pady=5) # 当用量(自动计算) usage_var = f"elec_{device}_usage" self.run_data['electricity'][usage_var] = tk.StringVar(value="0.0") ttk.Label(frame, textvariable=self.run_data['electricity'][usage_var]).grid(row=row, column=4, padx=5, pady=5) ``` ### 总结: 缺少输入框的主要原因是: 1. `create_new_grid` 方法未完整实现 2. 其他区块(电量、燃料等)完全缺失实现 3. 变量类型使用不当(`DoubleVar` 可能导致显示问题) 通过完整实现所有区块并使用 `StringVar` 替代 `DoubleVar`,可以解决输入框缺失的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值