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()
        # 显示新的界面,例如 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.根据汽车名称进行关键字查询效果展示:

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,展示如何在QT中实现登录界面页面之间的跳转: ```python from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QMessageBox class LoginWindow(QWidget): def __init__(self): super().__init__() self.username_label = QLabel("Username:") self.username_edit = QLineEdit() self.password_label = QLabel("Password:") self.password_edit = QLineEdit() self.password_edit.setEchoMode(QLineEdit.Password) self.login_button = QPushButton("Login") self.login_button.clicked.connect(self.login) vbox = QVBoxLayout() hbox1 = QHBoxLayout() hbox2 = QHBoxLayout() hbox1.addWidget(self.username_label) hbox1.addWidget(self.username_edit) hbox2.addWidget(self.password_label) hbox2.addWidget(self.password_edit) vbox.addLayout(hbox1) vbox.addLayout(hbox2) vbox.addWidget(self.login_button) self.setLayout(vbox) self.setWindowTitle("Login") def login(self): # 假设正确的用户名和密码是 "admin" 和 "password" if self.username_edit.text() == "admin" and self.password_edit.text() == "password": self.close() self.main_window = MainWindow() self.main_window.show() else: QMessageBox.warning(self, "Error", "Incorrect username or password") class MainWindow(QWidget): def __init__(self): super().__init__() self.greeting_label = QLabel("Welcome to the main window!") vbox = QVBoxLayout() vbox.addWidget(self.greeting_label) self.setLayout(vbox) self.setWindowTitle("Main Window") if __name__ == '__main__': app = QApplication([]) login_window = LoginWindow() login_window.show() app.exec_() ``` 这个示例中,`LoginWindow` 类表示登录界面,`MainWindow` 类表示页面。当用户在登录界面中输入正确的用户名和密码并点击登录按钮时,程序将关闭登录界面并打开页面。如果输入的用户名或密码不正确,程序将弹出一个警告对话框。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值