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

news2024/11/28 0:47:44

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()
        # 显示新的界面,例如 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()


登录注册界面效果展示如图:
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, 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()

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

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

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

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

相关文章

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP

Live800:深度解析,客户服务如何塑造品牌形象

在当今竞争激烈的市场环境中&#xff0c;品牌形象对于企业的成功至关重要。而客户服务作为品牌与消费者之间最直接的互动方式&#xff0c;不仅影响着消费者的购买决策&#xff0c;更在塑造品牌形象方面发挥着不可替代的作用。本文将深度解析客户服务如何塑造品牌形象&#xff0…

1074 宇宙无敌加法器(测试点5)

solution 每位权值不同的高精度加法测试点5&#xff1a;结果为0的情况 #include<iostream> #include<string> using namespace std; int main(){string rule, a, b, ans "";int carry 0, temp, cnt, power;cin >> rule >> a >> b;…

【Python】FastAPI返回不带双引号的字符串

昨天为获取代理ip写的一个接口&#xff0c;但返回的数据是带有双引号&#xff0c;终究不适合一些应用场景&#xff0c;带引号的是这样的&#xff1a; 说实在话&#xff0c;一时我也愣住了&#xff0c;竟然不知道要咋去掉这个双引号。因为是api接口&#xff0c;直接显示结果&…

HW面试常见知识点2——研判分析(蓝队中级版)

&#x1f340;文章简介&#xff1a;又到了一年一度的HW时刻&#xff0c;本文写给新手想快速进阶HW蓝中的网安爱好者们&#xff0c; 通读熟练掌握本文面试定个蓝中还是没问题的&#xff01;大家也要灵活随机应变&#xff0c;不要太刻板的回答&#xff09; &#x1f341;个人主页…

计算机网络 期末复习(谢希仁版本)第8章

元文件就是一种非常小的文件&#xff0c;它描述或指明其他文件的一些重要信息。这里的元文件保存了有关这个音频/视频文件的信息。 10. 流式&#xff1a;TCP&#xff1b;流式实况&#xff1a;UDP。

零基础入门学用Arduino 第二部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

在windows下使用本地AI模型提供翻译、对话、文生图服务

文章目录 在windows下使用本地AI模型提供翻译、对话、文生图服务ollama简介下载安装配置环境变量模型安装目录服务监听地址跨域配置我的配置注意事项 开机自启 使用运行模型对话时的命令 查看本地已安装模型删除模型 查看ollama支持的模型 Docker Desktop简介下载安装配置开机自…

Linux驱动应用编程(四)IIC(获取BMP180温度/压力数据)

本文目录 一、基础1. 查看开发板手册&#xff0c;获取可用IIC总线2. 挂载从机&#xff0c;查看从机地址。3. 查看BMP180手册&#xff0c;使用命令读/写某寄存器值。4. 查看BMP180手册通信流程。 二、IIC常用API1. iic数据包/报2. ioctl函数 三、数据包如何被处理四、代码编写流…

(2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干

Vision-LSTM: xLSTM as Generic Vision Backbone 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2 方法 3 实验 3.1 分类设计 4 结论 0. 摘要 Transformer 被广泛用作计算…

FM148R,FM147A和利时卡件

FM148R,FM147A和利时卡件。软件组成及各部分功能软件组成---各组件功能注意事项&#xff1a;仿真功能&#xff1a;仿真系统可以用于在单机上对组态完成的工程内容进行模拟运行。FM148R,FM147A和利时卡件。便于对这些组态内容的正确性和合理性进行初步调试。二、FM148R,FM147A和…

【Vue】面经基础版-案例效果分析

面经效果演示 功能分析 通过演示效果发现&#xff0c;主要的功能页面有两个&#xff0c;一个是列表页&#xff0c;一个是详情页&#xff0c;并且在列表页点击时可以跳转到详情页底部导航可以来回切换&#xff0c;并且切换时&#xff0c;只有上面的主题内容在动态渲染 实现思路…

C++基础四:C++模板编程

目录 一:函数模板 二:类模板 空间配置器allocator 一:函数模板 模板代码只能同一实现,不能先声明,再在另一文件实现,模板代码都是放在头文件当中的,在头文件中直接实现 二:类模板 template<typename T=int> class SeqStack // 模板名称+类型参数列表 = 类名称…

8.3 Go 包的组织结构

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

list模拟与实现(附源码)

文章目录 声明list的简单介绍list的简单使用list中sort效率测试list的简单模拟封装迭代器insert模拟erase模拟头插、尾插、头删、尾删模拟自定义类型迭代器遍历const迭代器clear和析构函数拷贝构造&#xff08;传统写法&#xff09;拷贝构造&#xff08;现代写法&#xff09; 源…

LabVIEW控制PLC的实现方式

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

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(二)

概览 在上篇 Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)博文中,我们讨论了 Swift 语言中序列和集合元素排序的一些基本知识,我们还给出了以自定义类型中任意属性排序的“康庄大道”。 不过在实际的撸码场景中,我们往往需要的是“多属性”同时参与到排序的考…

Unity HDRP水系统

1.开启水系统 Script Interactions启用后&#xff0c;HDRP会为CPU上的水模拟分配内存。这允许您在水面上启用CPU模拟来查询高度信息。 2.Sky and Fog Volume中添加Water Rendering并勾选State 3.点击GameObject选择WaterSurface&#xff0c;选择要添加的水类型&#xff08;海…

【Vue】vuex 的使用 - 创建仓库

通用的地方我们一般会称之为仓库 1.安装 vuex 安装vuex与vue-router类似&#xff0c;vuex是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 vuex&#xff0c;就需要额外安装。 yarn add vuex3 或者 npm i vuex32.新建 store/index.js 专门存放 vuex ​ 为了维护项目…

基于协调过滤算法商品推荐系统的设计#计算机毕业设计

基于协调过滤算法商品推荐系统的设计#计算机毕业设计 管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品管理&#xff0c;论坛管理&#xff0c;商品资讯管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xf…