parent
a8838866e5
commit
21589bc701
@ -1,45 +0,0 @@
|
||||
import tkinter as tk
|
||||
|
||||
import tkinter.messagebox
|
||||
|
||||
from 主页面 import MainPage
|
||||
#from 家居信息 import JiaJuPage
|
||||
|
||||
|
||||
class LoginPage:
|
||||
def __init__(self,master):
|
||||
self.root = master
|
||||
self.page = tk.Frame(self.root)
|
||||
self.page.pack()
|
||||
self.root.title('智能家居系统')
|
||||
self.root.geometry("300x180")
|
||||
|
||||
self.username = tk.StringVar()
|
||||
self.password = tk.StringVar()
|
||||
|
||||
tk.Label(self.page).grid(row=0, column=0)
|
||||
tk.Label(self.page, text='账户').grid(row=1,column=0)
|
||||
tk.Entry(self.page, textvariable=self.username).grid(row=1, column=1)
|
||||
tk.Label(self.page, text='密码').grid(row=2, column=0)
|
||||
tk.Entry(self.page, textvariable=self.password).grid(row=2, column=1, pady=10)
|
||||
|
||||
tk.Button(self.page, text='登录', command=self.login_check).grid(row=3, column=0, pady=10)
|
||||
tk.Button(self.page, text='退出', command=root.quit).grid(row=3, column=1, pady=10,stick=tk.E)
|
||||
|
||||
def login_check(self):
|
||||
name = self.username.get()
|
||||
pwd = self.password.get()
|
||||
|
||||
if name == '123' or pwd == '123' :
|
||||
tkinter.messagebox.showinfo(title='恭喜', message='登录成功')
|
||||
self.page.destroy()
|
||||
#JiaJuPage(self.root)
|
||||
MainPage(self.root)
|
||||
else:
|
||||
tkinter.messagebox.showinfo(title='错误', message='账户或密码错误')
|
||||
|
||||
if __name__ == '__main__':
|
||||
root = tk.Tk()
|
||||
root.title("智能家居系统")
|
||||
LoginPage(root)
|
||||
root.mainloop()
|
@ -1,35 +0,0 @@
|
||||
import tkinter as tk
|
||||
from tkinter import messagebox
|
||||
from 家居信息 import JiaJuPage
|
||||
|
||||
class MainPage:
|
||||
def __init__(self, master):
|
||||
self.root = master
|
||||
self.page = tk.Frame(self.root)
|
||||
self.page.pack()
|
||||
self.root.geometry('600x400')
|
||||
self.create_page()
|
||||
def create_page(self):
|
||||
# 创建一个标签用于展示简单的家居信息标题
|
||||
self.home_info_title = tk.Label(self.page, text="主页面区", font=("Helvetica", 16))
|
||||
self.home_info_title.pack(pady=20)
|
||||
# 添加一个按钮用于跳转到家居信息页面
|
||||
self.goto_jiaju_button = tk.Button(self.page, text="家居信息", command=self.show_jiaju_info)
|
||||
self.goto_jiaju_button.pack(pady=10)
|
||||
def show_jiaju_info(self):
|
||||
# 销毁当前页面
|
||||
self.page.destroy()
|
||||
# 显示家居信息页面
|
||||
JiaJuInfoPage(self.root)
|
||||
class JiaJuInfoPage:
|
||||
def __init__(self, master):
|
||||
self.root = master
|
||||
self.page = tk.Frame(self.root)
|
||||
self.page.pack()
|
||||
self.root.geometry('600x400')
|
||||
JiaJuPage(self.root)
|
||||
|
||||
if __name__ == '__main__':
|
||||
root = tk.Tk()
|
||||
app = MainPage(root)
|
||||
root.mainloop()
|
@ -1,239 +0,0 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk, messagebox
|
||||
import pymysql
|
||||
#from 主页面 import MainPage
|
||||
|
||||
class JiaJuPage:
|
||||
def __init__(self, master):
|
||||
self.root = master
|
||||
self.root.title("智能家居系统 - 家居管理")
|
||||
self.root.geometry('1000x700')
|
||||
|
||||
self.conn = pymysql.connect(host='localhost', user='root', password='LH20021212', db='智能家居系统',
|
||||
charset='utf8mb4')
|
||||
self.cursor = self.conn.cursor()
|
||||
|
||||
self.create_widgets()
|
||||
|
||||
def create_widgets(self):
|
||||
# 创建表格框架和滚动条
|
||||
frame = tk.Frame(self.root)
|
||||
frame.pack(fill=tk.BOTH, expand=True)
|
||||
|
||||
scrollbar_y = tk.Scrollbar(frame, orient=tk.VERTICAL)
|
||||
scrollbar_x = tk.Scrollbar(frame, orient=tk.HORIZONTAL)
|
||||
|
||||
self.tree = ttk.Treeview(frame, columns=("ID", "名称", "颜色", "品牌", "价格", "生产日期"),
|
||||
yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
|
||||
self.tree.heading("#0", text="")
|
||||
self.tree.heading("ID", text="ID")
|
||||
self.tree.heading("名称", text="名称")
|
||||
self.tree.heading("颜色", text="颜色")
|
||||
self.tree.heading("品牌", text="品牌")
|
||||
self.tree.heading("价格", text="价格")
|
||||
self.tree.heading("生产日期", text="生产日期")
|
||||
self.tree.column("#0", width=0, stretch=tk.NO)
|
||||
self.tree.column("ID", anchor=tk.CENTER, width=50)
|
||||
self.tree.column("名称", anchor=tk.CENTER, width=100)
|
||||
self.tree.column("颜色", anchor=tk.CENTER, width=100)
|
||||
self.tree.column("品牌", anchor=tk.CENTER, width=100)
|
||||
self.tree.column("价格", anchor=tk.CENTER, width=100)
|
||||
self.tree.column("生产日期", anchor=tk.CENTER, width=100)
|
||||
|
||||
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
||||
scrollbar_y.config(command=self.tree.yview)
|
||||
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
|
||||
scrollbar_x.config(command=self.tree.xview)
|
||||
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
|
||||
|
||||
# 按钮区域
|
||||
button_frame = tk.Frame(self.root)
|
||||
button_frame.pack(pady=10)
|
||||
|
||||
tk.Button(button_frame, text="添加家居", command=self.add_jiaju_popup).pack(side=tk.LEFT, padx=10)
|
||||
tk.Button(button_frame, text="删除选中", command=self.delete_selected_jiaju).pack(side=tk.LEFT, padx=10)
|
||||
tk.Button(button_frame, text="修改选中", command=self.update_selected_jiaju_popup).pack(side=tk.LEFT, padx=10)
|
||||
tk.Button(button_frame, text="查询所有", command=self.query_all_jiaju).pack(side=tk.LEFT, padx=10)
|
||||
tk.Button(button_frame, text="返回主页面", command=self.query_all_jiaju).pack(side=tk.LEFT, padx=10)
|
||||
|
||||
query_frame = tk.Frame(self.root)
|
||||
query_frame.pack(pady=(10, 0)) # 添加一些垂直间隔
|
||||
|
||||
tk.Label(query_frame, text="名称:").pack(side=tk.LEFT)
|
||||
self.entry_name_query = tk.Entry(query_frame)
|
||||
self.entry_name_query.pack(side=tk.LEFT, padx=(5, 0)) # 为输入框之间添加一点水平间隔
|
||||
|
||||
tk.Label(query_frame, text="颜色:").pack(side=tk.LEFT)
|
||||
self.entry_color_query = tk.Entry(query_frame)
|
||||
self.entry_color_query.pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
tk.Label(query_frame, text="品牌:").pack(side=tk.LEFT)
|
||||
self.entry_brand_query = tk.Entry(query_frame)
|
||||
self.entry_brand_query.pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
tk.Label(query_frame, text="价格:").pack(side=tk.LEFT)
|
||||
self.entry_price_query = tk.Entry(query_frame)
|
||||
self.entry_price_query.pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
tk.Label(query_frame, text="生产日期:").pack(side=tk.LEFT)
|
||||
self.entry_production_date_query = tk.Entry(query_frame)
|
||||
self.entry_production_date_query.pack(side=tk.LEFT)
|
||||
|
||||
tk.Button(query_frame, text="查询", command=self.query_jiaju_condition).pack(side=tk.LEFT, padx=10)
|
||||
|
||||
self.query_all_jiaju() # 初始化加载所有数据
|
||||
|
||||
def query_all_jiaju(self):
|
||||
self.tree.delete(*self.tree.get_children())
|
||||
self.cursor.execute("SELECT * FROM jia_ju")
|
||||
rows = self.cursor.fetchall()
|
||||
for row in rows:
|
||||
self.tree.insert('', tk.END, values=row)
|
||||
|
||||
def add_jiaju_popup(self):
|
||||
def submit_add():
|
||||
name = entry_name.get()
|
||||
color = entry_color.get()
|
||||
brand = entry_brand.get()
|
||||
price = entry_price.get()
|
||||
production_date = entry_production_date.get()
|
||||
sql = f"INSERT INTO jia_ju(name, color, brand, price, production_date) VALUES ('{name}', '{color}', '{brand}', {price}, '{production_date}')"
|
||||
try:
|
||||
self.cursor.execute(sql)
|
||||
self.conn.commit()
|
||||
messagebox.showinfo("成功", "家居信息录入成功!")
|
||||
add_window.destroy() # 关闭弹窗后刷新列表
|
||||
self.query_all_jiaju()
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"录入失败: {e}")
|
||||
|
||||
add_window = tk.Toplevel(self.root)
|
||||
add_window.title("录入家居信息")
|
||||
tk.Label(add_window, text="名称:").pack()
|
||||
entry_name = tk.Entry(add_window)
|
||||
entry_name.pack()
|
||||
tk.Label(add_window, text="颜色:").pack()
|
||||
entry_color = tk.Entry(add_window)
|
||||
entry_color.pack()
|
||||
tk.Label(add_window, text="品牌:").pack()
|
||||
entry_brand = tk.Entry(add_window)
|
||||
entry_brand.pack()
|
||||
tk.Label(add_window, text="价格:").pack()
|
||||
entry_price = tk.Entry(add_window)
|
||||
entry_price.pack()
|
||||
tk.Label(add_window, text="生产日期:").pack()
|
||||
entry_production_date = tk.Entry(add_window)
|
||||
entry_production_date.pack()
|
||||
tk.Button(add_window, text="提交", command=submit_add).pack()
|
||||
|
||||
def delete_selected_jiaju(self):
|
||||
selected_items = self.tree.selection()
|
||||
if not selected_items:
|
||||
messagebox.showwarning("警告", "请先选择要删除的家居项!")
|
||||
return
|
||||
for item in selected_items:
|
||||
item_id = self.tree.item(item)['values'][0]
|
||||
sql = f"DELETE FROM jia_ju WHERE id={item_id}"
|
||||
try:
|
||||
self.cursor.execute(sql)
|
||||
self.conn.commit()
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"删除失败: {e}")
|
||||
self.conn.rollback()
|
||||
return
|
||||
messagebox.showinfo("成功", "选中的家居信息已删除!")
|
||||
self.query_all_jiaju() # 刷新列表
|
||||
|
||||
def update_selected_jiaju_popup(self):
|
||||
selected_items = self.tree.selection()
|
||||
if not selected_items:
|
||||
messagebox.showwarning("警告", "请先选择要修改的家居项!")
|
||||
return
|
||||
|
||||
item = selected_items[0] # 假设一次只修改一项
|
||||
item_values = self.tree.item(item)['values']
|
||||
item_id = item_values[0]
|
||||
|
||||
def submit_update():
|
||||
name = entry_name.get()
|
||||
color = entry_color.get()
|
||||
brand = entry_brand.get()
|
||||
price = entry_price.get()
|
||||
production_date = entry_production_date.get()
|
||||
sql = f"UPDATE jia_ju SET name='{name}', color='{color}', brand='{brand}', price={price}, production_date='{production_date}' WHERE id={item_id}"
|
||||
try:
|
||||
self.cursor.execute(sql)
|
||||
self.conn.commit()
|
||||
messagebox.showinfo("成功", "家居信息已更新!")
|
||||
update_window.destroy() # 关闭弹窗后刷新列表
|
||||
self.query_all_jiaju()
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"更新失败: {e}")
|
||||
|
||||
update_window = tk.Toplevel(self.root)
|
||||
update_window.title("修改家居信息")
|
||||
tk.Label(update_window, text="名称:").pack()
|
||||
entry_name = tk.Entry(update_window)
|
||||
entry_name.insert(tk.END, item_values[1]) # 预填充现有值
|
||||
entry_name.pack()
|
||||
tk.Label(update_window, text="颜色:").pack()
|
||||
entry_color = tk.Entry(update_window)
|
||||
entry_color.insert(tk.END, item_values[2])
|
||||
entry_color.pack()
|
||||
tk.Label(update_window, text="品牌:").pack()
|
||||
entry_brand = tk.Entry(update_window)
|
||||
entry_brand.insert(tk.END, item_values[3])
|
||||
entry_brand.pack()
|
||||
tk.Label(update_window, text="价格:").pack()
|
||||
entry_price = tk.Entry(update_window)
|
||||
entry_price.insert(tk.END, item_values[4])
|
||||
entry_price.pack()
|
||||
tk.Label(update_window, text="生产日期:").pack()
|
||||
entry_production_date = tk.Entry(update_window)
|
||||
entry_production_date.insert(tk.END, item_values[5])
|
||||
entry_production_date.pack()
|
||||
tk.Button(update_window, text="提交修改", command=submit_update).pack()
|
||||
|
||||
def query_jiaju_condition(self):
|
||||
name_cond = self.entry_name_query.get().strip()
|
||||
color_cond = self.entry_color_query.get().strip()
|
||||
brand_cond = self.entry_brand_query.get().strip()
|
||||
price_cond = self.entry_price_query.get().strip()
|
||||
production_date_cond = self.entry_production_date_query.get().strip()
|
||||
|
||||
conditions = []
|
||||
if name_cond:
|
||||
conditions.append(f"name LIKE '%{name_cond}%'")
|
||||
if color_cond:
|
||||
conditions.append(f"color LIKE '%{color_cond}%'")
|
||||
if brand_cond:
|
||||
conditions.append(f"brand LIKE '%{brand_cond}%'")
|
||||
if price_cond.isdigit(): # 确保价格是数字
|
||||
conditions.append(f"price = {price_cond}")
|
||||
if production_date_cond:
|
||||
conditions.append(f"production_date = '{production_date_cond}'")
|
||||
|
||||
where_clause = ' AND '.join(conditions) if conditions else '1=1'
|
||||
sql = f"SELECT * FROM jia_ju WHERE {where_clause}"
|
||||
|
||||
try:
|
||||
self.cursor.execute(sql)
|
||||
rows = self.cursor.fetchall()
|
||||
self.tree.delete(*self.tree.get_children())
|
||||
for row in rows:
|
||||
self.tree.insert('', tk.END, values=row)
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"查询失败: {e}")
|
||||
self.conn.rollback()
|
||||
|
||||
def close_conn(self):
|
||||
self.cursor.close()
|
||||
self.conn.close()
|
||||
self.root.destroy()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
root = tk.Tk()
|
||||
app = JiaJuPage(root)
|
||||
root.protocol("WM_DELETE_WINDOW", app.close_conn)
|
||||
root.mainloop()
|
@ -1,69 +0,0 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
import random
|
||||
import time
|
||||
|
||||
# 全局变量
|
||||
comfortable_temperature_range = (20, 24)
|
||||
comfortable_humidity_range = (40, 60)
|
||||
current_temperature = 0
|
||||
current_humidity = 0
|
||||
line_number = 0
|
||||
update_interval = 5000 # 每5秒更新一次
|
||||
root = None
|
||||
treeview = None
|
||||
|
||||
def reset_conditions():
|
||||
global current_temperature, current_humidity
|
||||
current_temperature = random.uniform(-12, 42)
|
||||
current_humidity = random.uniform(0, 100)
|
||||
|
||||
def adjust():
|
||||
global current_temperature, current_humidity
|
||||
reset_conditions()
|
||||
if not comfortable_temperature_range[0] <= current_temperature <= comfortable_temperature_range[1]:
|
||||
current_temperature = random.uniform(*comfortable_temperature_range)
|
||||
if not comfortable_humidity_range[0] <= current_humidity <= comfortable_humidity_range[1]:
|
||||
current_humidity = random.uniform(*comfortable_humidity_range)
|
||||
return current_temperature, current_humidity
|
||||
|
||||
def schedule_update():
|
||||
"""计划下一次更新"""
|
||||
global line_number
|
||||
line_number += 1
|
||||
initial_temp, initial_humidity = current_temperature, current_humidity
|
||||
adjusted_temp, adjusted_humidity = adjust()
|
||||
treeview.insert("", tk.END, values=(line_number,
|
||||
f"{initial_temp:.2f}°C",
|
||||
f"{initial_humidity:.2f}%",
|
||||
f"{adjusted_temp:.2f}°C",
|
||||
f"{adjusted_humidity:.2f}%"))
|
||||
# 安排下一次更新
|
||||
root.after(update_interval, schedule_update)
|
||||
|
||||
def main():
|
||||
global root, treeview
|
||||
root = tk.Tk()
|
||||
root.title("智能家居系统-空调自动调节系统")
|
||||
root.geometry("800x600")
|
||||
|
||||
treeview = ttk.Treeview(root,
|
||||
columns=("编号", "初始温度", "初始湿度", "调节后温度", "调节后湿度"),
|
||||
show="headings")
|
||||
treeview.heading("编号", text="编号")
|
||||
treeview.heading("初始温度", text="初始温度")
|
||||
treeview.heading("初始湿度", text="初始湿度")
|
||||
treeview.heading("调节后温度", text="调节后温度")
|
||||
treeview.heading("调节后湿度", text="调节后湿度")
|
||||
for col in treeview['columns']:
|
||||
treeview.column(col, width=80, anchor=tk.CENTER)
|
||||
treeview.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
|
||||
|
||||
root.rowconfigure(0, weight=1)
|
||||
root.columnconfigure(0, weight=1)
|
||||
|
||||
schedule_update() # 安排首次更新
|
||||
root.mainloop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
@ -1,67 +0,0 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
import random
|
||||
import time
|
||||
|
||||
class AirConditioner:
|
||||
def __init__(self):
|
||||
self.comfortable_temperature_range = (20, 24) # 添加舒适温度范围
|
||||
self.comfortable_humidity_range = (40, 60) # 添加舒适湿度范围
|
||||
self.reset_conditions()
|
||||
|
||||
def reset_conditions(self):
|
||||
self.current_temperature = random.uniform(-12, 42)
|
||||
self.current_humidity = random.uniform(0, 100)
|
||||
|
||||
def adjust(self):
|
||||
self.reset_conditions() # 获取新的初始温度和湿度
|
||||
if not self.comfortable_temperature_range[0] <= self.current_temperature <= self.comfortable_temperature_range[1]:
|
||||
self.current_temperature = random.uniform(*self.comfortable_temperature_range)
|
||||
if not self.comfortable_humidity_range[0] <= self.current_humidity <= self.comfortable_humidity_range[1]:
|
||||
self.current_humidity = random.uniform(*self.comfortable_humidity_range)
|
||||
return self.current_temperature, self.current_humidity # 返回调节后的温度和湿度
|
||||
|
||||
class ACApp(tk.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.title("空调自动调节系统")
|
||||
self.geometry("800x600")
|
||||
|
||||
self.treeview = ttk.Treeview(self,
|
||||
columns=("编号", "初始温度", "初始湿度", "调节后温度", "调节后湿度"),
|
||||
show="headings")
|
||||
self.treeview.heading("编号", text="编号")
|
||||
self.treeview.heading("初始温度", text="初始温度")
|
||||
self.treeview.heading("初始湿度", text="初始湿度")
|
||||
self.treeview.heading("调节后温度", text="调节后温度")
|
||||
self.treeview.heading("调节后湿度", text="调节后湿度")
|
||||
for col in self.treeview['columns']:
|
||||
self.treeview.column(col, width=80, anchor=tk.CENTER)
|
||||
self.treeview.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
|
||||
|
||||
self.aircon = AirConditioner()
|
||||
self.line_number = 0
|
||||
self.is_adjusted = False
|
||||
self.update_interval = 5000 # 每5秒更新一次
|
||||
self.schedule_update() # 安排首次更新
|
||||
|
||||
self.treeview.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
|
||||
self.rowconfigure(0, weight=1)
|
||||
self.columnconfigure(0, weight=1)
|
||||
|
||||
def schedule_update(self):
|
||||
"""计划下一次更新"""
|
||||
self.line_number += 1
|
||||
initial_temp, initial_humidity = self.aircon.current_temperature, self.aircon.current_humidity
|
||||
adjusted_temp, adjusted_humidity = self.aircon.adjust()
|
||||
self.treeview.insert("", tk.END, values=(self.line_number,
|
||||
f"{initial_temp:.1f}°C",
|
||||
f"{initial_humidity:.1f}%",
|
||||
f"{adjusted_temp:.1f}°C",
|
||||
f"{adjusted_humidity:.1f}%"))
|
||||
# 安排下一次更新
|
||||
self.after(self.update_interval, self.schedule_update)
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = ACApp()
|
||||
app.mainloop()
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
||||
17.5219813233319,10.705621045530922
|
@ -1,35 +0,0 @@
|
||||
import tkinter as tk
|
||||
from tkinter import messagebox
|
||||
from 家居信息 import JiaJuPage
|
||||
|
||||
class MainPage:
|
||||
def __init__(self, master):
|
||||
self.root = master
|
||||
self.page = tk.Frame(self.root)
|
||||
self.page.pack()
|
||||
self.root.geometry('600x400')
|
||||
self.create_page()
|
||||
def create_page(self):
|
||||
# 创建一个标签用于展示简单的家居信息标题
|
||||
self.home_info_title = tk.Label(self.page, text="主页面区", font=("Helvetica", 16))
|
||||
self.home_info_title.pack(pady=20)
|
||||
# 添加一个按钮用于跳转到家居信息页面
|
||||
self.goto_jiaju_button = tk.Button(self.page, text="家居信息", command=self.show_jiaju_info)
|
||||
self.goto_jiaju_button.pack(pady=10)
|
||||
def show_jiaju_info(self):
|
||||
# 销毁当前页面
|
||||
self.page.destroy()
|
||||
# 显示家居信息页面
|
||||
JiaJuInfoPage(self.root)
|
||||
class JiaJuInfoPage:
|
||||
def __init__(self, master):
|
||||
self.root = master
|
||||
self.page = tk.Frame(self.root)
|
||||
self.page.pack()
|
||||
self.root.geometry('600x400')
|
||||
JiaJuPage(self.root)
|
||||
|
||||
if __name__ == '__main__':
|
||||
root = tk.Tk()
|
||||
app = MainPage(root)
|
||||
root.mainloop()
|
@ -1,239 +0,0 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk, messagebox
|
||||
import pymysql
|
||||
#from 主页面 import MainPage
|
||||
|
||||
class JiaJuPage:
|
||||
def __init__(self, master):
|
||||
self.root = master
|
||||
self.root.title("智能家居系统 - 家居管理")
|
||||
self.root.geometry('1000x700')
|
||||
|
||||
self.conn = pymysql.connect(host='localhost', user='root', password='LH20021212', db='智能家居系统',
|
||||
charset='utf8mb4')
|
||||
self.cursor = self.conn.cursor()
|
||||
|
||||
self.create_widgets()
|
||||
|
||||
def create_widgets(self):
|
||||
# 创建表格框架和滚动条
|
||||
frame = tk.Frame(self.root)
|
||||
frame.pack(fill=tk.BOTH, expand=True)
|
||||
|
||||
scrollbar_y = tk.Scrollbar(frame, orient=tk.VERTICAL)
|
||||
scrollbar_x = tk.Scrollbar(frame, orient=tk.HORIZONTAL)
|
||||
|
||||
self.tree = ttk.Treeview(frame, columns=("ID", "名称", "颜色", "品牌", "价格", "生产日期"),
|
||||
yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
|
||||
self.tree.heading("#0", text="")
|
||||
self.tree.heading("ID", text="ID")
|
||||
self.tree.heading("名称", text="名称")
|
||||
self.tree.heading("颜色", text="颜色")
|
||||
self.tree.heading("品牌", text="品牌")
|
||||
self.tree.heading("价格", text="价格")
|
||||
self.tree.heading("生产日期", text="生产日期")
|
||||
self.tree.column("#0", width=0, stretch=tk.NO)
|
||||
self.tree.column("ID", anchor=tk.CENTER, width=50)
|
||||
self.tree.column("名称", anchor=tk.CENTER, width=100)
|
||||
self.tree.column("颜色", anchor=tk.CENTER, width=100)
|
||||
self.tree.column("品牌", anchor=tk.CENTER, width=100)
|
||||
self.tree.column("价格", anchor=tk.CENTER, width=100)
|
||||
self.tree.column("生产日期", anchor=tk.CENTER, width=100)
|
||||
|
||||
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
||||
scrollbar_y.config(command=self.tree.yview)
|
||||
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
|
||||
scrollbar_x.config(command=self.tree.xview)
|
||||
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
|
||||
|
||||
# 按钮区域
|
||||
button_frame = tk.Frame(self.root)
|
||||
button_frame.pack(pady=10)
|
||||
|
||||
tk.Button(button_frame, text="添加家居", command=self.add_jiaju_popup).pack(side=tk.LEFT, padx=10)
|
||||
tk.Button(button_frame, text="删除选中", command=self.delete_selected_jiaju).pack(side=tk.LEFT, padx=10)
|
||||
tk.Button(button_frame, text="修改选中", command=self.update_selected_jiaju_popup).pack(side=tk.LEFT, padx=10)
|
||||
tk.Button(button_frame, text="查询所有", command=self.query_all_jiaju).pack(side=tk.LEFT, padx=10)
|
||||
tk.Button(button_frame, text="返回主页面", command=self.query_all_jiaju).pack(side=tk.LEFT, padx=10)
|
||||
|
||||
query_frame = tk.Frame(self.root)
|
||||
query_frame.pack(pady=(10, 0)) # 添加一些垂直间隔
|
||||
|
||||
tk.Label(query_frame, text="名称:").pack(side=tk.LEFT)
|
||||
self.entry_name_query = tk.Entry(query_frame)
|
||||
self.entry_name_query.pack(side=tk.LEFT, padx=(5, 0)) # 为输入框之间添加一点水平间隔
|
||||
|
||||
tk.Label(query_frame, text="颜色:").pack(side=tk.LEFT)
|
||||
self.entry_color_query = tk.Entry(query_frame)
|
||||
self.entry_color_query.pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
tk.Label(query_frame, text="品牌:").pack(side=tk.LEFT)
|
||||
self.entry_brand_query = tk.Entry(query_frame)
|
||||
self.entry_brand_query.pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
tk.Label(query_frame, text="价格:").pack(side=tk.LEFT)
|
||||
self.entry_price_query = tk.Entry(query_frame)
|
||||
self.entry_price_query.pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
tk.Label(query_frame, text="生产日期:").pack(side=tk.LEFT)
|
||||
self.entry_production_date_query = tk.Entry(query_frame)
|
||||
self.entry_production_date_query.pack(side=tk.LEFT)
|
||||
|
||||
tk.Button(query_frame, text="查询", command=self.query_jiaju_condition).pack(side=tk.LEFT, padx=10)
|
||||
|
||||
self.query_all_jiaju() # 初始化加载所有数据
|
||||
|
||||
def query_all_jiaju(self):
|
||||
self.tree.delete(*self.tree.get_children())
|
||||
self.cursor.execute("SELECT * FROM jia_ju")
|
||||
rows = self.cursor.fetchall()
|
||||
for row in rows:
|
||||
self.tree.insert('', tk.END, values=row)
|
||||
|
||||
def add_jiaju_popup(self):
|
||||
def submit_add():
|
||||
name = entry_name.get()
|
||||
color = entry_color.get()
|
||||
brand = entry_brand.get()
|
||||
price = entry_price.get()
|
||||
production_date = entry_production_date.get()
|
||||
sql = f"INSERT INTO jia_ju(name, color, brand, price, production_date) VALUES ('{name}', '{color}', '{brand}', {price}, '{production_date}')"
|
||||
try:
|
||||
self.cursor.execute(sql)
|
||||
self.conn.commit()
|
||||
messagebox.showinfo("成功", "家居信息录入成功!")
|
||||
add_window.destroy() # 关闭弹窗后刷新列表
|
||||
self.query_all_jiaju()
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"录入失败: {e}")
|
||||
|
||||
add_window = tk.Toplevel(self.root)
|
||||
add_window.title("录入家居信息")
|
||||
tk.Label(add_window, text="名称:").pack()
|
||||
entry_name = tk.Entry(add_window)
|
||||
entry_name.pack()
|
||||
tk.Label(add_window, text="颜色:").pack()
|
||||
entry_color = tk.Entry(add_window)
|
||||
entry_color.pack()
|
||||
tk.Label(add_window, text="品牌:").pack()
|
||||
entry_brand = tk.Entry(add_window)
|
||||
entry_brand.pack()
|
||||
tk.Label(add_window, text="价格:").pack()
|
||||
entry_price = tk.Entry(add_window)
|
||||
entry_price.pack()
|
||||
tk.Label(add_window, text="生产日期:").pack()
|
||||
entry_production_date = tk.Entry(add_window)
|
||||
entry_production_date.pack()
|
||||
tk.Button(add_window, text="提交", command=submit_add).pack()
|
||||
|
||||
def delete_selected_jiaju(self):
|
||||
selected_items = self.tree.selection()
|
||||
if not selected_items:
|
||||
messagebox.showwarning("警告", "请先选择要删除的家居项!")
|
||||
return
|
||||
for item in selected_items:
|
||||
item_id = self.tree.item(item)['values'][0]
|
||||
sql = f"DELETE FROM jia_ju WHERE id={item_id}"
|
||||
try:
|
||||
self.cursor.execute(sql)
|
||||
self.conn.commit()
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"删除失败: {e}")
|
||||
self.conn.rollback()
|
||||
return
|
||||
messagebox.showinfo("成功", "选中的家居信息已删除!")
|
||||
self.query_all_jiaju() # 刷新列表
|
||||
|
||||
def update_selected_jiaju_popup(self):
|
||||
selected_items = self.tree.selection()
|
||||
if not selected_items:
|
||||
messagebox.showwarning("警告", "请先选择要修改的家居项!")
|
||||
return
|
||||
|
||||
item = selected_items[0] # 假设一次只修改一项
|
||||
item_values = self.tree.item(item)['values']
|
||||
item_id = item_values[0]
|
||||
|
||||
def submit_update():
|
||||
name = entry_name.get()
|
||||
color = entry_color.get()
|
||||
brand = entry_brand.get()
|
||||
price = entry_price.get()
|
||||
production_date = entry_production_date.get()
|
||||
sql = f"UPDATE jia_ju SET name='{name}', color='{color}', brand='{brand}', price={price}, production_date='{production_date}' WHERE id={item_id}"
|
||||
try:
|
||||
self.cursor.execute(sql)
|
||||
self.conn.commit()
|
||||
messagebox.showinfo("成功", "家居信息已更新!")
|
||||
update_window.destroy() # 关闭弹窗后刷新列表
|
||||
self.query_all_jiaju()
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"更新失败: {e}")
|
||||
|
||||
update_window = tk.Toplevel(self.root)
|
||||
update_window.title("修改家居信息")
|
||||
tk.Label(update_window, text="名称:").pack()
|
||||
entry_name = tk.Entry(update_window)
|
||||
entry_name.insert(tk.END, item_values[1]) # 预填充现有值
|
||||
entry_name.pack()
|
||||
tk.Label(update_window, text="颜色:").pack()
|
||||
entry_color = tk.Entry(update_window)
|
||||
entry_color.insert(tk.END, item_values[2])
|
||||
entry_color.pack()
|
||||
tk.Label(update_window, text="品牌:").pack()
|
||||
entry_brand = tk.Entry(update_window)
|
||||
entry_brand.insert(tk.END, item_values[3])
|
||||
entry_brand.pack()
|
||||
tk.Label(update_window, text="价格:").pack()
|
||||
entry_price = tk.Entry(update_window)
|
||||
entry_price.insert(tk.END, item_values[4])
|
||||
entry_price.pack()
|
||||
tk.Label(update_window, text="生产日期:").pack()
|
||||
entry_production_date = tk.Entry(update_window)
|
||||
entry_production_date.insert(tk.END, item_values[5])
|
||||
entry_production_date.pack()
|
||||
tk.Button(update_window, text="提交修改", command=submit_update).pack()
|
||||
|
||||
def query_jiaju_condition(self):
|
||||
name_cond = self.entry_name_query.get().strip()
|
||||
color_cond = self.entry_color_query.get().strip()
|
||||
brand_cond = self.entry_brand_query.get().strip()
|
||||
price_cond = self.entry_price_query.get().strip()
|
||||
production_date_cond = self.entry_production_date_query.get().strip()
|
||||
|
||||
conditions = []
|
||||
if name_cond:
|
||||
conditions.append(f"name LIKE '%{name_cond}%'")
|
||||
if color_cond:
|
||||
conditions.append(f"color LIKE '%{color_cond}%'")
|
||||
if brand_cond:
|
||||
conditions.append(f"brand LIKE '%{brand_cond}%'")
|
||||
if price_cond.isdigit(): # 确保价格是数字
|
||||
conditions.append(f"price = {price_cond}")
|
||||
if production_date_cond:
|
||||
conditions.append(f"production_date = '{production_date_cond}'")
|
||||
|
||||
where_clause = ' AND '.join(conditions) if conditions else '1=1'
|
||||
sql = f"SELECT * FROM jia_ju WHERE {where_clause}"
|
||||
|
||||
try:
|
||||
self.cursor.execute(sql)
|
||||
rows = self.cursor.fetchall()
|
||||
self.tree.delete(*self.tree.get_children())
|
||||
for row in rows:
|
||||
self.tree.insert('', tk.END, values=row)
|
||||
except Exception as e:
|
||||
messagebox.showerror("错误", f"查询失败: {e}")
|
||||
self.conn.rollback()
|
||||
|
||||
def close_conn(self):
|
||||
self.cursor.close()
|
||||
self.conn.close()
|
||||
self.root.destroy()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
root = tk.Tk()
|
||||
app = JiaJuPage(root)
|
||||
root.protocol("WM_DELETE_WINDOW", app.close_conn)
|
||||
root.mainloop()
|
@ -1,22 +0,0 @@
|
||||
from flask import Flask
|
||||
|
||||
import pymysql
|
||||
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:LH20021212@localhost:3306/智能家居系统'
|
||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
class Jia():
|
||||
__tablename__ = '家居信息' # 注意这里使用英文表名
|
||||
编号 = db.Column(db.Integer, primary_key=True)
|
||||
名称 = db.Column(db.String(20), nullable=False)
|
||||
品牌 = db.Column(db.String(20), nullable=False)
|
||||
颜色 = db.Column(db.String(20), nullable=False)
|
||||
价格 = db.Column(db.String(20), nullable=False)
|
||||
生产日期 = db.Column(db.String(20), nullable=False)
|
@ -1,44 +0,0 @@
|
||||
import tkinter as tk
|
||||
|
||||
import tkinter.messagebox
|
||||
|
||||
from 主页面 import MainPage
|
||||
|
||||
|
||||
|
||||
class LoginPage:
|
||||
def __init__(self,master):
|
||||
self.root = master
|
||||
self.page = tk.Frame(self.root)
|
||||
self.page.pack()
|
||||
self.root.geometry("300x180")
|
||||
|
||||
self.username = tk.StringVar()
|
||||
self.password = tk.StringVar()
|
||||
|
||||
tk.Label(self.page).grid(row=0, column=0)
|
||||
tk.Label(self.page, text='账户').grid(row=1,column=0)
|
||||
tk.Entry(self.page, textvariable=self.username).grid(row=1, column=1)
|
||||
tk.Label(self.page, text='密码').grid(row=2, column=0)
|
||||
tk.Entry(self.page, textvariable=self.password).grid(row=2, column=1, pady=10)
|
||||
|
||||
tk.Button(self.page, text='登录', command=self.login_check).grid(row=3, column=0, pady=10)
|
||||
tk.Button(self.page, text='退出', command=root.quit).grid(row=3, column=1, pady=10,stick=tk.E)
|
||||
|
||||
def login_check(self):
|
||||
name = self.username.get()
|
||||
pwd = self.password.get()
|
||||
|
||||
if name == '123' or pwd == '123' :
|
||||
tkinter.messagebox.showinfo(title='恭喜', message='登录成功')
|
||||
self.page.destroy()
|
||||
#JiaJuPage(self.root)
|
||||
MainPage(self.root)
|
||||
else:
|
||||
tkinter.messagebox.showinfo(title='错误', message='账户或密码错误')
|
||||
|
||||
if __name__ == '__main__':
|
||||
root = tk.Tk()
|
||||
root.title("智能家居系统-登录页面")
|
||||
LoginPage(root)
|
||||
root.mainloop()
|
@ -1,67 +0,0 @@
|
||||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
import random
|
||||
import time
|
||||
|
||||
class AirConditioner:
|
||||
def __init__(self):
|
||||
self.comfortable_temperature_range = (20, 24) # 添加舒适温度范围
|
||||
self.comfortable_humidity_range = (40, 60) # 添加舒适湿度范围
|
||||
self.reset_conditions()
|
||||
|
||||
def reset_conditions(self):
|
||||
self.current_temperature = random.uniform(-12, 42)
|
||||
self.current_humidity = random.uniform(0, 100)
|
||||
|
||||
def adjust(self):
|
||||
self.reset_conditions() # 获取新的初始温度和湿度
|
||||
if not self.comfortable_temperature_range[0] <= self.current_temperature <= self.comfortable_temperature_range[1]:
|
||||
self.current_temperature = random.uniform(*self.comfortable_temperature_range)
|
||||
if not self.comfortable_humidity_range[0] <= self.current_humidity <= self.comfortable_humidity_range[1]:
|
||||
self.current_humidity = random.uniform(*self.comfortable_humidity_range)
|
||||
return self.current_temperature, self.current_humidity # 返回调节后的温度和湿度
|
||||
|
||||
class ACApp(tk.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.title("空调自动调节系统")
|
||||
self.geometry("800x600")
|
||||
|
||||
self.treeview = ttk.Treeview(self,
|
||||
columns=("编号", "初始温度", "初始湿度", "调节后温度", "调节后湿度"),
|
||||
show="headings")
|
||||
self.treeview.heading("编号", text="编号")
|
||||
self.treeview.heading("初始温度", text="初始温度")
|
||||
self.treeview.heading("初始湿度", text="初始湿度")
|
||||
self.treeview.heading("调节后温度", text="调节后温度")
|
||||
self.treeview.heading("调节后湿度", text="调节后湿度")
|
||||
for col in self.treeview['columns']:
|
||||
self.treeview.column(col, width=80, anchor=tk.CENTER)
|
||||
self.treeview.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
|
||||
|
||||
self.aircon = AirConditioner()
|
||||
self.line_number = 0
|
||||
self.is_adjusted = False
|
||||
self.update_interval = 5000 # 每5秒更新一次
|
||||
self.schedule_update() # 安排首次更新
|
||||
|
||||
self.treeview.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
|
||||
self.rowconfigure(0, weight=1)
|
||||
self.columnconfigure(0, weight=1)
|
||||
|
||||
def schedule_update(self):
|
||||
"""计划下一次更新"""
|
||||
self.line_number += 1
|
||||
initial_temp, initial_humidity = self.aircon.current_temperature, self.aircon.current_humidity
|
||||
adjusted_temp, adjusted_humidity = self.aircon.adjust()
|
||||
self.treeview.insert("", tk.END, values=(self.line_number,
|
||||
f"{initial_temp:.1f}°C",
|
||||
f"{initial_humidity:.1f}%",
|
||||
f"{adjusted_temp:.1f}°C",
|
||||
f"{adjusted_humidity:.1f}%"))
|
||||
# 安排下一次更新
|
||||
self.after(self.update_interval, self.schedule_update)
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = ACApp()
|
||||
app.mainloop()
|
Binary file not shown.
Loading…
Reference in new issue