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}")
这段代码数据录入功能为什么没有框
最新发布