赞
踩
- import tkinter as tk
- from tkinter import messagebox,ttk
- from tkinter import simpledialog
- from ui.car_ui import start_car_ui
-
-
- # 设置主题风格
- style = ttk.Style()
- style.theme_use("default") # 可以根据需要选择不同的主题,如"clam"、"default"、"alt"等
- # 假设的用户数据库,实际应用中应该使用数据库
- users_db = {
- "user1": "password1"
- }
-
-
- def login_user():
- # 获取输入的用户名和密码
- username = username_entry.get()
- password = password_entry.get()
-
- if username in users_db and users_db[username] == password:
- messagebox.showinfo("登录", "登录成功!")
- # 隐藏登录界面的组件
- login_frame.pack_forget()
- # 显示新的界面,例如 CarUI
- start_car_ui()
- else:
- messagebox.showerror("登录", "用户名或密码错误!")
-
-
- def register_user():
- # 注册新用户
- new_username = simpledialog.askstring("注册", "请输入新用户名:")
- if not new_username:
- messagebox.showwarning("注册", "用户名不能为空!")
- return
- if new_username in users_db:
- messagebox.showerror("注册", "用户名已存在,请选择其他用户名。")
- return
-
- new_password = simpledialog.askstring("注册", "请输入新密码:", show='*')
- if not new_password:
- messagebox.showwarning("注册", "密码不能为空!")
- return
-
- # 将新用户添加到用户数据库
- users_db[new_username] = new_password
- messagebox.showinfo("注册", "注册成功,请使用新用户名和密码登录。")
-
-
- # 创建主窗口
- root = tk.Tk()
- root.title("用户登录")
- root.geometry("300x200") # 设置窗口大小
-
- # 创建一个框架来包含用户名和密码的输入框以及按钮
- login_frame = tk.Frame(root)
- login_frame.pack(pady=20)
-
- # 在框架中创建用户名和密码输入框以及标签
- username_label = tk.Label(login_frame, text="用户名:", font=("Arial", 12))
- username_label.grid(row=0, column=0, sticky='e', padx=(0, 10), pady=5) # 右对齐,增加垂直间距
-
- username_entry = tk.Entry(login_frame, font=("Arial", 12), width=20)
- username_entry.grid(row=0, column=1, padx=(10, 0), pady=5) # 设置输入框宽度,增加垂直间距
-
- password_label = tk.Label(login_frame, text="密码:", font=("Arial", 12))
- password_label.grid(row=1, column=0, sticky='e', padx=(0, 10), pady=5) # 右对齐,增加垂直间距
-
- password_entry = tk.Entry(login_frame, show="*", font=("Arial", 12), width=20)
- password_entry.grid(row=1, column=1, padx=(10, 0), pady=5) # 设置输入框宽度,增加垂直间距
-
- # 在框架中创建登录和注册按钮
- login_button = tk.Button(login_frame, text="登录", command=login_user, font=("Arial", 12), bg="#4CAF50", fg="white")
- login_button.grid(row=2, column=0, columnspan=2, pady=(10, 0), sticky='we', ipadx=50) # 跨两列,设置按钮宽度,左右对齐
-
- register_button = tk.Button(login_frame, text="注册", command=register_user, font=("Arial", 12), bg="#2196F3",
- fg="white")
- register_button.grid(row=3, column=0, columnspan=2, sticky='we', ipadx=50) # 跨两列,设置按钮宽度,左右对齐
-
- # 运行主循环
- root.mainloop()
- import tkinter as tk
- from tkinter import ttk, messagebox
- import pandas as pd
- import pymysql
- from PIL import Image, ImageTk
-
-
- class CarUI:
- def __init__(self, root):
- self.root = root
- self.root.title("汽车界面")
- self.root.config(bg='lightblue')
- self.update_detail = self.update_detail # 在这里定义update_detail方法
- # self.img_path = image_path
-
- # 设置中文字体
- self.font = ("KaiTi", 12)
-
- # # 设置主题
- style = ttk.Style()
- style.theme_use('default') # 使用默认主题
-
- # 初始化图像变量
- self.images = {
- 'iaon': None,
- 'ibon': None,
- 'icon': None,
- 'idon': None
- }
-
- self.create_widgets()
-
- def create_widgets(self):
- # 第一行:汽车变速箱下拉框和相关控件
- self.gear_var = tk.StringVar(self.root)
- self.gear_var.set("自动") # 设置默认变速箱类型
-
- self.gear_label = tk.Label(self.root, text="变速箱类型", font=self.font)
- self.gear_label.grid(row=0, column=0, padx=5, pady=5, sticky='e')
-
- self.gear_menubutton = tk.Menubutton(self.root, textvariable=self.gear_var, font=self.font)
- self.gear_menubutton.grid(row=0, column=1, padx=5, pady=5, sticky='w')
-
- self.gear_menu = tk.Menu(self.gear_menubutton, tearoff=0)
- self.gear_menubutton['menu'] = self.gear_menu
- for value in ["自动", "手动"]:
- self.gear_menu.add_radiobutton(label=value, variable=self.gear_var, value=value)
-
- # 添加销量标签和条目框
- self.sales_label = tk.Label(self.root, text="销量:", font=self.font)
- self.sales_label.grid(row=0, column=2, padx=5, pady=5, sticky='e')
- self.sales_var = tk.StringVar(self.root)
- self.sales_entry = tk.Entry(self.root, textvariable=self.sales_var)
- self.sales_entry.grid(row=0, column=3, padx=5, pady=5)
-
- # 添加评分标签和条目框
- self.rating_label = tk.Label(self.root, text="评分:", font=self.font)
- self.rating_label.grid(row=0, column=4, padx=5, pady=5)
- self.rating_var = tk.StringVar(self.root)
- self.rating_entry = tk.Entry(self.root, textvariable=self.rating_var)
- self.rating_entry.grid(row=0, column=5, padx=5, pady=5)
-
- # 添加平均分搜索按钮
- self.rank_search_button = tk.Button(self.root, text="平均分搜索", font=self.font)
- self.rank_search_button.grid(row=0, column=7, padx=2, pady=5) # 将平均分搜索按钮放在关键字搜索按钮的右侧
-
- # 第二行:汽车名称搜索框和相关控件
- self.car_name_label = tk.Label(self.root, text="汽车名称:", font=self.font)
- self.car_name_label.grid(row=1, column=0, padx=3, pady=5, sticky='e') # 减小padx
- self.car_name_var = tk.StringVar(self.root)
- self.car_name_entry = tk.Entry(self.root, textvariable=self.car_name_var, width=100)
- self.car_name_entry.grid(row=1, column=1, columnspan=6, padx=2, pady=5,
- sticky='ew') # 增加columnspan, sticky='ew'使控件水平填充
-
- # 添加关键字搜索按钮
- self.keyword_search_button = tk.Button(self.root, text="关键字搜索", font=self.font)
- self.keyword_search_button.grid(row=1, column=7, padx=2, pady=5, sticky='w') # sticky='w'使按钮靠右对齐
-
- # 第三行:四个字段
- self.columns = ('汽车名称', '汽车排名', '汽车评分', '汽车销量')
- self.tree = ttk.Treeview(self.root, columns=self.columns, show='headings')
- for col in self.columns:
- self.tree.heading(col, text=col)
- self.tree.grid(row=2, column=0, columnspan=8, padx=5, pady=5)
-
- # 绑定Treeview的选中事件
- self.tree.bind('<<TreeviewSelect>>', self.on_tree_select)
-
- # 绑定搜索方法
- self.bind_search_methods()
-
- # 绑定加载数据方法
- self.load_data() # 在初始化界面时加载数据
-
- # 详情模块
- self.detail_frame = tk.Frame(self.root)
- self.detail_frame.grid(row=3, column=0, columnspan=8, padx=5, pady=5, sticky='nsew')
-
- # 左侧图片显示
- self.detail_image_label = tk.Label(self.detail_frame)
- self.detail_image_label.grid(row=0, column=0, padx=5, pady=5)
-
- # 右侧汽车详细信息文本框
- self.detail_text = tk.Text(self.detail_frame, height=15, width=80, font=self.font)
- self.detail_text.grid(row=0, column=1, padx=5, pady=5, sticky='nsew')
-
- def on_tree_select(self, event):
- # 获取选中的项
- selected_item = self.tree.selection()[0]
- # 获取选中项的数据
- data = self.tree.item(selected_item, 'values')
- # 更新详情模块
- self.update_detail(data)
-
- def update_detail(self, data):
- # 清空文本框
- self.detail_text.delete(1.0, tk.END)
- self.detail_image_label.config(image=None) # 清除之前的图片
-
- # 插入数据到文本框
- if len(data) >= 11: # 确保data至少有11个元素
- # 假设数据库中字段的顺序与Treeview中显示的顺序一致
- self.detail_text.insert(tk.END, f"车名: {data[0]}\n")
- self.detail_text.insert(tk.END, f"品牌: {data[4]}\n")
- self.detail_text.insert(tk.END, f"价格: {data[8]}元\n")
- self.detail_text.insert(tk.END, f"热度: {data[9]}\n")
- self.detail_text.insert(tk.END, f"类型: {data[5]}\n")
- self.detail_text.insert(tk.END, f"排量: {data[6]}L\n")
- self.detail_text.insert(tk.END, f"变速箱: {data[7]}\n")
- self.detail_text.insert(tk.END, f"评分: {data[2]}分\n")
- self.detail_text.insert(tk.END, f"销量: {data[3]}\n")
- self.detail_text.insert(tk.END, f"排名: {data[1]}\n")
-
- # 加载图片并显示
- image_path = data[10] # 假设第11列是图片路径
- if image_path: # 确保图片路径不为空
- try:
- # 打开图片并调整大小
- image = Image.open(image_path)
- image = image.resize((230, 230)) # 假设图片大小为200x200
- image = ImageTk.PhotoImage(image)
- self.detail_image_label.config(image=image)
- self.detail_image_label.image = image
- except Exception as e:
- messagebox.showerror("错误", f"无法加载图片: {e}")
-
- def load_data(self):
- # 连接数据库
- connection = pymysql.connect(host='192.168.111.132', user='root', password='123', db='car')
- try:
- with connection.cursor() as cursor:
- # 定义SQL查询语句,选择所有字段并按照数据库中的顺序排列
- sql = "SELECT ranking, car_name, price, hot, brand, style, dispt, gear, pingfen, plrs,images FROM cars"
- cursor.execute(sql)
- # 获取所有记录
- result = cursor.fetchall()
- # 将数据添加到Treeview控件
- self.tree.delete(*self.tree.get_children())
- for row in result:
- # 将所有字段插入到Treeview中,按照数据库中的顺序
- self.tree.insert('', 'end', values=(
- row[1], row[0], row[8], row[9], row[4], row[5], row[6], row[7], row[2], row[3],row[10]))
- finally:
- connection.close()
-
- def search_keyword(self):
- # 获取用户输入的关键字
- keyword = self.car_name_var.get()
- # 连接到数据库
- connection = pymysql.connect(host='192.168.111.132', user='root', password='123', db='car')
- try:
- # 使用数据库连接创建一个游标对象
- with connection.cursor() as cursor:
- # 定义SQL查询语句,使用占位符%表示关键字
- sql = "SELECT ranking, car_name, price, hot, brand, style, dispt, gear, pingfen, plrs FROM cars WHERE car_name LIKE %s"
- # 执行SQL查询,将关键字作为参数传递
- cursor.execute(sql, (f"%{keyword}%",))
- # 获取查询结果
- result = cursor.fetchall()
- # 清空Treeview控件中的所有条目
- self.tree.delete(*self.tree.get_children())
- # 遍历查询结果,将每条记录插入到Treeview控件中
- for row in result:
- self.tree.insert('', 'end', values=(row[1], row[0], row[8], row[9])) # 假设要显示汽车名称、排名、评分和评论数
- finally:
- # 关闭数据库连接
- connection.close()
-
- def search_rating(self):
- # 获取用户选择的变速箱类型
- selected_gear = self.gear_var.get()
- # 连接到数据库
- connection = pymysql.connect(host='192.168.111.132', user='root', password='123', db='car')
- try:
- # 使用数据库连接创建一个游标对象
- with connection.cursor() as cursor:
- # 定义SQL查询语句,根据变速箱类型进行分组统计
- sql = """
- SELECT gear, SUM(`plrs`) AS total_sales,
- AVG(`pingfen`) AS average_rating
- FROM cars
- WHERE gear = %s
- GROUP BY gear
- """
- # 执行SQL查询,将变速箱类型作为参数传递
- cursor.execute(sql, (selected_gear,))
- # 获取查询结果
- result = cursor.fetchone()
- if result:
- # 插入数据到Treeview控件
- self.tree.insert('', 'end', values=(result[0], result[1], result[2]))
- finally:
- # 关闭数据库连接
- connection.close()
-
- def bind_search_methods(self):
- # 绑定平均分搜索方法
- self.rank_search_button.config(command=self.search_rating) # 确保这里指向正确的搜索方法
- # 绑定关键字搜索方法
- self.keyword_search_button.config(command=self.search_keyword) # 绑定关键字搜索方法
- # # 绑定加载数据方法
- self.load_data() # 假设在初始化界面时加载数据
-
- def search_rating(self):
- # 获取用户选择的变速箱类型
- selected_gear = self.gear_var.get()
- # 连接到数据库
- connection = pymysql.connect(host='192.168.111.132', user='root', password='123', db='car')
- try:
- # 使用数据库连接创建一个游标对象
- with connection.cursor() as cursor:
- # 定义SQL查询语句,根据变速箱类型进行分组统计
- sql = """
- SELECT gear, SUM(`plrs`) AS total_sales,
- AVG(`pingfen`) AS average_rating
- FROM cars
- WHERE gear = %s
- GROUP BY gear
- """
- # 执行SQL查询,将变速箱类型作为参数传递
- cursor.execute(sql, (selected_gear,))
- # 获取查询结果
- result = cursor.fetchone()
- if result:
- # 更新销量文本框
- self.sales_var.set(result[1])
- # 更新评分文本框,确保显示一位小数
- self.rating_var.set(f"{result[2]:.1f}")
- finally:
- # 关闭数据库连接
- connection.close()
-
-
- def start_car_ui():
- root = tk.Tk()
- app = CarUI(root)
- root.mainloop()
-
-
- if __name__ == "__main__":
- start_car_ui()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。