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.rhkb.cn/news/344208.html

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

相关文章

你可以直接和数据库对话了!DB-GPT 用LLM定义数据库下一代交互方式,数据库领域的GPT、开启数据3.0 时代

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 你可以直接和数据库对话了&#xff01;DB-GPT 用LLM定义数据库下一代交互方式&#xff0c;数据库领…

网页文档下载不了怎么办 网页文档下载方法

一个方法&#xff0c;搞定所有网页文档下载。如果你也需要从网页下载各种文档&#xff0c;那么本文一定可以帮到你。无须充值会员&#xff0c;各大平台文档下到爽。看到就是赚到&#xff0c;还不赶快学起来。有关网页文档下载不了怎么办&#xff0c;网页文档下载方法的问题&…

LabVIEW控制PLC的实现方式

LabVIEW与PLC的结合可以充分发挥两者的优点&#xff0c;实现更高效、灵活和可靠的自动化控制系统。本文将详细介绍LabVIEW控制PLC的实现方式&#xff0c;包括通信接口、数据交换、编程方法及实际应用案例&#xff0c;帮助用户理解并应用这一技术。 通信接口 常见通信协议 La…

Linux下线程的互斥与同步详解

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…

HIP的应用可移植性

Application portability with HIP — ROCm Blogs (amd.com) 许多科学应用程序在配备AMD的计算平台和超级计算机上运行&#xff0c;包括Frontier&#xff0c;这是世界上第一台Exascale系统。这些来自不同科学领域的应用程序通过使用Heterogeneous-compute Interface for Portab…

tomcat8w.exe指向了别的tomcat

这种情况通常发生是因为Tomcat服务在注册表中的配置指向了错误的可执行文件路径。tomcat8w.exe是一个Windows服务配置工具&#xff0c;它用于管理Tomcat服务&#xff0c;包括设置Path to executable&#xff0c;即指向Tomcat服务实际启动的.exe文件的路径。如果Path to executa…

Windows下对于Qt中带 / 的路径的处理

在Windows下&#xff0c;如果你想使用操作系统的分隔符显示用户的路径&#xff0c;请使用 toNativeSeparators()。 请看以下代码&#xff1a; void Player::on_playBtn_clicked() {if (this->m_url.isEmpty()) {openMedia();if (this->m_url.isEmpty())return;}qDebug(…

如何使用Python的Turtle模块绘制小猪

一、前置条件 在开始学习如何使用Python的Turtle模块进行绘画之前&#xff0c;请确保你的电脑已安装Python环境。如果尚未安装Python&#xff0c;你可以从Python官网下载并安装最新版本。 Turtle模块是Python内置的一个用于绘图的库&#xff0c;通常不需要额外安装。如果你发…

反转链表 (oj题)

一、题目链接 https://leetcode.cn/problems/reverse-linked-list/submissions/538124207 二、题目思路 1.定义三个指针&#xff0c;p1先指向NULL p2指向头结点 p3指向第二个结点 2.p2的next指向p1。然后移动指针&#xff0c;p1来到p2的位置&#xff0c;p2来到p3的位置&…

Latex中表格(3)

Latex中的表格 一、多行或多列单元格 这篇主要说Latex中表格出现多行或者多列单元格的形式. 一、多行或多列单元格 可能用到的宏包 \usepackage{booktabs}\usepackage{multirow} 代码&#xff1a; \begin{table}[h!] \centering \caption{Your caption here} \begin{tabul…

LabVIEW与PLC的区别

LabVIEW和PLC是工业自动化领域中常见的两种控制和测控方案&#xff0c;各自有独特的优点和适用场景。本文将从多角度比较两者&#xff0c;帮助用户在选择控制系统时做出更明智的决策。 技术背景 LabVIEW LabVIEW是由National Instruments公司开发的图形化编程环境&#xff0…

高中数学:数列-基础概念

一、什么是数列&#xff1f; 一般地&#xff0c;我们把按照确定的顺序排列的一列数称为数列&#xff0c;数列中的每一个数叫做这个数列的项&#xff0c;数列的第一项称为首项。 项数有限个的数列叫做有穷数列&#xff0c;项数无限个的数列叫做无穷数列。 二、一般形式 数列和…

解决富文本中抖音视频无法播放的问题——403

问题 富文本中的抖音视频无法播放&#xff0c;资源状态码是403禁止访问打开控制台&#xff0c;可以看到在项目中打开&#xff0c;数据请求的请求头多了一个Referer: http://localhost:3000/而复制链接在新窗口直接打开&#xff0c;请求头中并不会携带Referer 解决方案 在ind…

golang协程工作池处理多任务示例

1. 工作方法实现 // 工作线程 // id : 线程号 // jobs : 任务通道 (chan) // results: 完成结果通道 (chan) func worker(id int, jobs <-chan int, results chan<- int) {//遍历任务for j : range jobs {fmt.Println("工作协程: ", id, "启动任务: &quo…

LabVIEW伺服电机测控系统

LabVIEW伺服电机测控系统 开发了一个基于LabVIEW的伺服电机测控系统。系统主要用于精确控制电机的运动&#xff0c;以达到高效率和高精度的要求。通过使用LabVIEW软件和配套的硬件&#xff0c;开发者能够实现对伺服电机的实时监控和控制&#xff0c;进而提高整个系统的性能和可…

HTTP协议分析实验:通过一次下载任务抓包分析

HTTP协议分析 问&#xff1a;HTTP是干啥用的&#xff1f; 最简单通俗的解释&#xff1a;HTTP 是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。 在Internet上的Web服务器上存放的都是超文本信息&#xff0c;客户机需要通过HTTP协议传输所要访问的超文本信息。 一、…

ABAP - SAP与企业微信集成

最近接到一个SAP直接给企业微信推送消息的需求&#xff0c;说实话之前一直没接触过&#xff0c;脑袋空空的&#xff0c;最终通过在百度搜索案例成功解决了&#xff0c;百度虽然一直被诟病&#xff0c;但却无法否认它的神奇。实现效果 实现思路&#xff1a;从需求出发&#xff0…

Vue基础知识:插槽——默认插槽,插槽的后备内容,具名插槽,作用域插槽的认识与使用。(slot,#default,row的认识)

1.插槽的基本认识&#xff1a; 作用&#xff1a;让组件内部的一些结构支持自定义 插槽的分类&#xff1a; 1.默认插槽&#xff08;组件内只能定制一处结构&#xff09; 2.具名插槽&#xff08;组件内可以定制多次结构&#xff09; 简单而言&#xff1a;就是你希望封装一个…

五分钟上手IoT小程序

五分钟上手IoT小程序 IoT小程序框架搭建开发环境首先安装NodeJs安装NodeJs验证安装成功 安装cnpm 安装VSCode 开发IDE下载开发IDE安装开发IDE安装框架脚手架 下载模拟器创建工程项目应用编译(打包构建) VSCode 开发IDE安装插件通过开发插件创建工程编译工程debug编译编译太慢问…

SpringBoot 的多配置文件

文章目录 SpringBoot 的多配置文件spring.profiles.active 配置Profile 和 ActiveProfiles 注解 SpringBoot 的多配置文件 spring.profiles.active 配置 默认情况下&#xff0c;当你启动 SpringBoot 项目时&#xff0c;会在日志中看到如下一条 INFO 信息&#xff1a; No act…