Python的登录注册界面跳转汽车主页面

1.登录注册界面的代码:

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()# 显示新的界面,例如 CarUIstart_car_ui()else:messagebox.showerror("登录", "用户名或密码错误!")def register_user():# 注册新用户new_username = simpledialog.askstring("注册", "请输入新用户名:")if not new_username:messagebox.showwarning("注册", "用户名不能为空!")returnif new_username in users_db:messagebox.showerror("注册", "用户名已存在,请选择其他用户名。")returnnew_password = simpledialog.askstring("注册", "请输入新密码:", show='*')if not new_password:messagebox.showwarning("注册", "密码不能为空!")return# 将新用户添加到用户数据库users_db[new_username] = new_passwordmessagebox.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()


登录注册界面效果展示如图:
1.运行login_ui界面的效果图:

2.注册界面效果图:

3.根据注册的用户名和密码登录成功效果图:

这里注册的用户名和密码都是123,没有根据mysql数据库的用户名和密码进行绑定。根据自己的进行完善代码连接数据库,根据数据库的用户名和密码进行注册登录。
 

2.登录成功之后跳转汽车界面的代码:
 

import tkinter as tk
from tkinter import ttk, messagebox
import pandas as pd
import pymysql
from PIL import Image, ImageTkclass CarUI:def __init__(self, root):self.root = rootself.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_menufor 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')  # 减小padxself.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))  # 假设图片大小为200x200image = ImageTk.PhotoImage(image)self.detail_image_label.config(image=image)self.detail_image_label.image = imageexcept 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_ratingFROM carsWHERE gear = %sGROUP 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_ratingFROM carsWHERE gear = %sGROUP 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()

1.汽车主界面的效果展示:

2.根据变速箱类型手动和自动进行平均分搜索效果展示:
销量就是计算每个变速箱汽车自动(手动)有多少辆,然后它们的销量总数相加
平均分就是计算变速箱汽车自动(手动)的车辆的总评分,然后再除以含自动(手动)的车辆个数
3.根据汽车名称进行关键字查询效果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/24605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

切莫被人工智能的洪流吞噬

切莫被人工智能的洪流吞噬 当今社会似乎正在被“人工智能”的概念淹没&#xff0c;各行各业也都期望能与其挂钩&#xff0c;彷佛这就是新世代下的灵药&#xff0c;有人把这一现象称为“旧互联网时代的新革命”。但是我们&#xff0c;这一现象的缔造者&#xff0c;又处于这洪流…

计算机网络--计算机网络概念

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 0.计算机网络简介 0.2 计算机网络的功能简介 数据通信(连通性)资源共享&#xff1a; 软件硬件数据 分布式处理 多台计算机各自承担同…

项目-双人五子棋对战:匹配模块的实现(4)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 在上一篇中, 我们已经讲到了匹配模块中前后端的接口约定, 也讲到了前后端它们是怎么完成发送请求, 接收请求, 处理响应, 返回响应这个过程的. 在这一篇中, 我们将对匹配模块用到的一些组件, 进行讲解. 后端代码 匹配器…

【Linux取经路】网络套接字编程——初识篇

文章目录 一、端口号1.1 认识端口号1.2 端口号 VS 进程 PID 二、认识 TCP 协议三、认识 UDP四、网络字节序列五、socket 编程接口5.1 常用 API5.2 sockaddr 结构 六、结语 一、端口号 网络通信的本质是应用层软件进行数据的发送和接受&#xff0c;软件在启动之后&#xff0c;本…

网络安全快速入门(十五)(下)手动创建用户及su,sudo命令

15.8 序言 前面我们已经大概了解了创建用户一些相关文件&#xff0c;接下来我们来手动创建用户&#xff0c;话不多说&#xff0c;我们直接开搞&#xff01;&#xff01;&#xff01; 15.9 手动创建用户&#xff1a; 一般来讲&#xff0c;我们创建用户通过useradd和passwd命令来…

python数据分析-心脏衰竭分析与预测

研究背景 人的心脏有四个瓣膜&#xff0c;主动脉银、二尖、肺动脉和三尖源 不管是那一个膜发生了病变&#xff0c;都会导致心脏内的血流受到影响&#xff0c;这就是通常所说的心脏期膜病&#xff0c;很多是需要通过手术的方式进行改善的。随着人口老龄化的加剧,&#xff0c;心…

Java基础_异常

Java基础_异常 异常体系介绍编译时异常和运行时异常异常的作用异常的处理方式JVM默认的处理方式自己处理&#xff08;捕获异常&#xff09;try...catch灵魂四问Throwable的成员方法 抛出处理 综合练习自定义异常来源Gitee地址 异常体系介绍 异常是什么&#xff1f; 程序中可能出…

【Java】String类 -- 重要概念!!!

// 源码 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0 /…

RTOS笔记--信号量+互斥量+事件组

信号量的本质 信号量是一个特殊的队列&#xff0c;但并不涉及数据传输&#xff0c;因此不需要读写位置和发送者列表&#xff0c;但是多了一个最大计数值。 个人理解&#xff1a;信号量类似一个加入了保护机制的全局变量&#xff0c;不会因为中断切换的原因而导致数据出错。 信号…

Steam游戏如何选择适合的服务器

在Steam平台上&#xff0c;玩家可以享受到来自世界各地开发者的游戏作品。然而&#xff0c;要获得最佳的游戏体验&#xff0c;选择合适的服务器至关重要。本文将从网络延迟、服务器位置、游戏类型和个人偏好等多个方面&#xff0c;为玩家提供选择Steam游戏服务器的实用指南。 如…

k8s挂载配置文件(通过ConfigMap方式)

一、ConfigMap简介 K8s中的ConfigMap是一种用于存储配置数据的API对象&#xff0c;属于Kubernetes中的核心对象。它用于将应用程序的配置信息与容器镜像分离&#xff0c;以便在不重新构建镜像的情况下进行配置的修改和更新。ConfigMap可以存储键值对、文本文件或者以特定格式组…

PDF编辑与修正 提高工作效率 Enfocus PitStop Pro 2022 中文

Enfocus PitStop Pro 2022是一款专为Mac用户设计的强大PDF编辑和校对工具。它支持添加、删除、合并、分割PDF页面&#xff0c;以及文本和图像的编辑&#xff0c;如文字替换、字体更改、颜色调整等。内置自动修复功能&#xff0c;能快速检测并修复缺失字体、重叠文本等常见问题。…

【Text2SQL 论文】PET-SQL:用 Cross-Consistency 的 prompt 增强的两阶段 Text2SQL 框架

论文&#xff1a;PET-SQL: A Prompt-enhanced Two-stage Text-to-SQL Framework with Cross-consistency ⭐⭐⭐ arXiv:2403.09732&#xff0c;商汤 & 北大 Code&#xff1a;GitHub 一、论文速读 论文一开始提出了以往 prompt-based 的 Text2SQL 方法的一些缺点&#xff1…

使用缓存降低数据库并发读写方案探索

文章目录 前言缓存设计思想缓存划分缓存应用时机 客户端缓存浏览器缓存网关或代理服务器缓存CDNPCDN 服务端缓存本地缓存本地缓存实现Java堆缓存memcached/ecachecaffeineORM框架一级/二级缓存 分布式缓存分布式缓存优缺点分布式缓存实现分布式缓存实施过程可能遇到问题分布式缓…

Socket编程权威指南(二)完美掌握TCP流式协议及Socket编程的recv()和send()

在上一篇文章中&#xff0c;我们学习了Socket编程的基础知识&#xff0c;包括创建Socket、绑定地址、监听连接、接收连接等操作。然而&#xff0c;真正的套接字编程远不止于此。本文将重点介绍TCP 流式协议&#xff0c;什么是粘包问题&#xff1f;如何解决粘包问题 &#xff1f…

利用R包“Phenotype”对表型值进行检查

首先&#xff0c;你需要确保你已经安装了R和RStudio&#xff08;如果你想用RStudio的话&#xff09;。然后&#xff0c;你可以按照以下步骤进行操作&#xff1a; 加载数据&#xff1a;首先&#xff0c;你需要加载你的表型数据。如果你的数据是以CSV、Excel等格式保存的&#x…

地面站Mission planner

官方教程; Mission Planner地面站介绍 | Autopilot (gitbook.io) Mission Planner 功能/屏幕 — Mission Planner 文档 (ardupilot.org) 安卓或者windows软件下载地址&#xff1a; 地面站连接及使用 plane (cuav.net) 在完全装机后再进行各干器件的校准&#xff0c;没有组…

【LeetCode 前缀和 + 哈希表】LC_560_和为K的子数组

文章目录 1. 和为K的子数组&#x1f197; 1. 和为K的子数组&#x1f197; 题目链接&#x1f517; &#x1f427;解题思路&#xff1a; 前缀和 哈希表 &#x1f34e; 设i为数组中的任意位置&#xff0c;⽤ sum[i] 表⽰ [0, i] 区间内所有元素的和。 &#x1f34e; 想知道有…

【设计模式深度剖析】【5】【行为型】【迭代器模式】

&#x1f448;️上一篇:策略模式 设计模式-专栏&#x1f448;️ 文章目录 迭代器模式定义英文原话直译如何理解呢&#xff1f; 迭代器模式的角色1. Iterator&#xff08;迭代器&#xff09;2. ConcreteIterator&#xff08;具体迭代器&#xff09;3. Aggregate&#xff08;聚…

用 DataGridView 控件显示数据

使用DataGridView&#xff0c;可以很方便显示数据。 &#xff08;1&#xff09;Visual Studio版本&#xff1a;Visual Studio 2022 &#xff08;2&#xff09;应用程序类型&#xff1a;windows form &#xff08;3&#xff09;编程语言&#xff1a;C# 一、目标框架 .NET Fra…