You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
10 KiB
239 lines
10 KiB
6 months ago
|
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()
|