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;又处于这洪流…

Linux基础指令文件管理004

本章主要讲述如何查找文件。 操作系统&#xff1a; CentOS Stream 9 操作步骤&#xff1a; 指令find [rootlocalhost a]# find -name "*.txt"查找当前目录下的所有.txt文件 ./b/3.txt ./b/4.txt ./1.txt[rootlocalhost a]# find . #查找文件 . ./b ./b/c ./b/3.t…

360数字安全:2024年2月勒索软件流行态势分析报告

勒索软件传播至今&#xff0c;360反勒索服务已累计接收到数万勒索软件感染求助。随着新型勒索软件的快速蔓延&#xff0c;企业数据泄露风险不断上升&#xff0c; 勒索金额在数百万到近亿美元的勒索案件不断出现。勒索软件给企业和个人带来的影响范围越来越广&#xff0c;危害性…

【Android面试八股文】Android两种序列化方式Serialzable和Parcelable有什么区别?为什么Intent传递对象需要序列化?

文章目录 序列Parcelable,Serializable的区别?这道题想考察什么?考察的知识点考生应该如何回答Bunder传递对象为什么需要序列化?Serializable,简单易用基本使用serialVersionUIDParcelable , 速度至上Parcel区别测试速度对比测试方法结果总结序列Parcelable,Serializable的…

BOT算不算作弊

https://arxiv.org/abs/2406.04271 1. 引言 介绍大型语言模型&#xff08;LLMs&#xff09;在推理任务中的局限性。 概述现有推理方法的分类和局限性&#xff1a;单次查询推理和多查询推理。 提出Buffer of Thoughts (BoT) 框架&#xff0c;旨在提高LLMs的推理准确性、效率和…

npm安装依赖过慢

今天在使用npm安装taro框架的依赖时&#xff0c;速度慢到吐血&#xff0c;使用了淘宝镜像源依然很慢&#xff0c;安装一个多小时没反应&#xff0c;最后清理了缓存再次安装速度就快很多了&#xff0c;因此解决方法大致有两种&#xff1a; 使用淘宝镜像源 原域名&#xff1a; ht…

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

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

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

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

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

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

spring boot中常用的多线程案例

在Spring Boot中&#xff0c;多线程的应用场景广泛&#xff0c;尤其是在需要提高系统并发处理能力和资源利用率的场景下。以下是一些Spring Boot中常用的多线程案例&#xff0c;并结合参考文章中的相关数字和信息进行说明&#xff1a; 1.异步任务处理 案例描述: 在Spring Bo…

安徽京准 NTP时钟同步服务器具体配置方法是什么?

安徽京准 NTP时钟同步服务器具体配置方法是什么&#xff1f; 安徽京准 NTP时钟同步服务器具体配置方法是什么&#xff1f; 可以使用特权终结点 (PEP) 来更新 Azure Stack Hub 中的时间服务器。 使用可解析为两个或更多个 NTP&#xff08;网络时间协议&#xff09;服务器 IP 地…

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

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

Go每日一库之rotatelogs

介绍 Golang的rotatelogs库是一个用于日志轮转&#xff08;log rotation&#xff09;的库。日志轮转是一种常用的日志管理策略&#xff0c;它允许开发者将日志按照一定规则分割成多个文件&#xff0c;以便于管理和分析。通过使用rotatelogs库&#xff0c;开发者可以方便地实现…

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;能快速检测并修复缺失字体、重叠文本等常见问题。…