当前位置:   article > 正文

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

python登录后跳转到主界面

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

  1. import tkinter as tk
  2. from tkinter import messagebox,ttk
  3. from tkinter import simpledialog
  4. from ui.car_ui import start_car_ui
  5. # 设置主题风格
  6. style = ttk.Style()
  7. style.theme_use("default") # 可以根据需要选择不同的主题,如"clam""default""alt"
  8. # 假设的用户数据库,实际应用中应该使用数据库
  9. users_db = {
  10. "user1": "password1"
  11. }
  12. def login_user():
  13. # 获取输入的用户名和密码
  14. username = username_entry.get()
  15. password = password_entry.get()
  16. if username in users_db and users_db[username] == password:
  17. messagebox.showinfo("登录", "登录成功!")
  18. # 隐藏登录界面的组件
  19. login_frame.pack_forget()
  20. # 显示新的界面,例如 CarUI
  21. start_car_ui()
  22. else:
  23. messagebox.showerror("登录", "用户名或密码错误!")
  24. def register_user():
  25. # 注册新用户
  26. new_username = simpledialog.askstring("注册", "请输入新用户名:")
  27. if not new_username:
  28. messagebox.showwarning("注册", "用户名不能为空!")
  29. return
  30. if new_username in users_db:
  31. messagebox.showerror("注册", "用户名已存在,请选择其他用户名。")
  32. return
  33. new_password = simpledialog.askstring("注册", "请输入新密码:", show='*')
  34. if not new_password:
  35. messagebox.showwarning("注册", "密码不能为空!")
  36. return
  37. # 将新用户添加到用户数据库
  38. users_db[new_username] = new_password
  39. messagebox.showinfo("注册", "注册成功,请使用新用户名和密码登录。")
  40. # 创建主窗口
  41. root = tk.Tk()
  42. root.title("用户登录")
  43. root.geometry("300x200") # 设置窗口大小
  44. # 创建一个框架来包含用户名和密码的输入框以及按钮
  45. login_frame = tk.Frame(root)
  46. login_frame.pack(pady=20)
  47. # 在框架中创建用户名和密码输入框以及标签
  48. username_label = tk.Label(login_frame, text="用户名:", font=("Arial", 12))
  49. username_label.grid(row=0, column=0, sticky='e', padx=(0, 10), pady=5) # 右对齐,增加垂直间距
  50. username_entry = tk.Entry(login_frame, font=("Arial", 12), width=20)
  51. username_entry.grid(row=0, column=1, padx=(10, 0), pady=5) # 设置输入框宽度,增加垂直间距
  52. password_label = tk.Label(login_frame, text="密码:", font=("Arial", 12))
  53. password_label.grid(row=1, column=0, sticky='e', padx=(0, 10), pady=5) # 右对齐,增加垂直间距
  54. password_entry = tk.Entry(login_frame, show="*", font=("Arial", 12), width=20)
  55. password_entry.grid(row=1, column=1, padx=(10, 0), pady=5) # 设置输入框宽度,增加垂直间距
  56. # 在框架中创建登录和注册按钮
  57. login_button = tk.Button(login_frame, text="登录", command=login_user, font=("Arial", 12), bg="#4CAF50", fg="white")
  58. login_button.grid(row=2, column=0, columnspan=2, pady=(10, 0), sticky='we', ipadx=50) # 跨两列,设置按钮宽度,左右对齐
  59. register_button = tk.Button(login_frame, text="注册", command=register_user, font=("Arial", 12), bg="#2196F3",
  60. fg="white")
  61. register_button.grid(row=3, column=0, columnspan=2, sticky='we', ipadx=50) # 跨两列,设置按钮宽度,左右对齐
  62. # 运行主循环
  63. root.mainloop()


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

2.注册界面效果图:

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

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

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

  1. import tkinter as tk
  2. from tkinter import ttk, messagebox
  3. import pandas as pd
  4. import pymysql
  5. from PIL import Image, ImageTk
  6. class CarUI:
  7. def __init__(self, root):
  8. self.root = root
  9. self.root.title("汽车界面")
  10. self.root.config(bg='lightblue')
  11. self.update_detail = self.update_detail # 在这里定义update_detail方法
  12. # self.img_path = image_path
  13. # 设置中文字体
  14. self.font = ("KaiTi", 12)
  15. # # 设置主题
  16. style = ttk.Style()
  17. style.theme_use('default') # 使用默认主题
  18. # 初始化图像变量
  19. self.images = {
  20. 'iaon': None,
  21. 'ibon': None,
  22. 'icon': None,
  23. 'idon': None
  24. }
  25. self.create_widgets()
  26. def create_widgets(self):
  27. # 第一行:汽车变速箱下拉框和相关控件
  28. self.gear_var = tk.StringVar(self.root)
  29. self.gear_var.set("自动") # 设置默认变速箱类型
  30. self.gear_label = tk.Label(self.root, text="变速箱类型", font=self.font)
  31. self.gear_label.grid(row=0, column=0, padx=5, pady=5, sticky='e')
  32. self.gear_menubutton = tk.Menubutton(self.root, textvariable=self.gear_var, font=self.font)
  33. self.gear_menubutton.grid(row=0, column=1, padx=5, pady=5, sticky='w')
  34. self.gear_menu = tk.Menu(self.gear_menubutton, tearoff=0)
  35. self.gear_menubutton['menu'] = self.gear_menu
  36. for value in ["自动", "手动"]:
  37. self.gear_menu.add_radiobutton(label=value, variable=self.gear_var, value=value)
  38. # 添加销量标签和条目框
  39. self.sales_label = tk.Label(self.root, text="销量:", font=self.font)
  40. self.sales_label.grid(row=0, column=2, padx=5, pady=5, sticky='e')
  41. self.sales_var = tk.StringVar(self.root)
  42. self.sales_entry = tk.Entry(self.root, textvariable=self.sales_var)
  43. self.sales_entry.grid(row=0, column=3, padx=5, pady=5)
  44. # 添加评分标签和条目框
  45. self.rating_label = tk.Label(self.root, text="评分:", font=self.font)
  46. self.rating_label.grid(row=0, column=4, padx=5, pady=5)
  47. self.rating_var = tk.StringVar(self.root)
  48. self.rating_entry = tk.Entry(self.root, textvariable=self.rating_var)
  49. self.rating_entry.grid(row=0, column=5, padx=5, pady=5)
  50. # 添加平均分搜索按钮
  51. self.rank_search_button = tk.Button(self.root, text="平均分搜索", font=self.font)
  52. self.rank_search_button.grid(row=0, column=7, padx=2, pady=5) # 将平均分搜索按钮放在关键字搜索按钮的右侧
  53. # 第二行:汽车名称搜索框和相关控件
  54. self.car_name_label = tk.Label(self.root, text="汽车名称:", font=self.font)
  55. self.car_name_label.grid(row=1, column=0, padx=3, pady=5, sticky='e') # 减小padx
  56. self.car_name_var = tk.StringVar(self.root)
  57. self.car_name_entry = tk.Entry(self.root, textvariable=self.car_name_var, width=100)
  58. self.car_name_entry.grid(row=1, column=1, columnspan=6, padx=2, pady=5,
  59. sticky='ew') # 增加columnspan, sticky='ew'使控件水平填充
  60. # 添加关键字搜索按钮
  61. self.keyword_search_button = tk.Button(self.root, text="关键字搜索", font=self.font)
  62. self.keyword_search_button.grid(row=1, column=7, padx=2, pady=5, sticky='w') # sticky='w'使按钮靠右对齐
  63. # 第三行:四个字段
  64. self.columns = ('汽车名称', '汽车排名', '汽车评分', '汽车销量')
  65. self.tree = ttk.Treeview(self.root, columns=self.columns, show='headings')
  66. for col in self.columns:
  67. self.tree.heading(col, text=col)
  68. self.tree.grid(row=2, column=0, columnspan=8, padx=5, pady=5)
  69. # 绑定Treeview的选中事件
  70. self.tree.bind('<<TreeviewSelect>>', self.on_tree_select)
  71. # 绑定搜索方法
  72. self.bind_search_methods()
  73. # 绑定加载数据方法
  74. self.load_data() # 在初始化界面时加载数据
  75. # 详情模块
  76. self.detail_frame = tk.Frame(self.root)
  77. self.detail_frame.grid(row=3, column=0, columnspan=8, padx=5, pady=5, sticky='nsew')
  78. # 左侧图片显示
  79. self.detail_image_label = tk.Label(self.detail_frame)
  80. self.detail_image_label.grid(row=0, column=0, padx=5, pady=5)
  81. # 右侧汽车详细信息文本框
  82. self.detail_text = tk.Text(self.detail_frame, height=15, width=80, font=self.font)
  83. self.detail_text.grid(row=0, column=1, padx=5, pady=5, sticky='nsew')
  84. def on_tree_select(self, event):
  85. # 获取选中的项
  86. selected_item = self.tree.selection()[0]
  87. # 获取选中项的数据
  88. data = self.tree.item(selected_item, 'values')
  89. # 更新详情模块
  90. self.update_detail(data)
  91. def update_detail(self, data):
  92. # 清空文本框
  93. self.detail_text.delete(1.0, tk.END)
  94. self.detail_image_label.config(image=None) # 清除之前的图片
  95. # 插入数据到文本框
  96. if len(data) >= 11: # 确保data至少有11个元素
  97. # 假设数据库中字段的顺序与Treeview中显示的顺序一致
  98. self.detail_text.insert(tk.END, f"车名: {data[0]}\n")
  99. self.detail_text.insert(tk.END, f"品牌: {data[4]}\n")
  100. self.detail_text.insert(tk.END, f"价格: {data[8]}元\n")
  101. self.detail_text.insert(tk.END, f"热度: {data[9]}\n")
  102. self.detail_text.insert(tk.END, f"类型: {data[5]}\n")
  103. self.detail_text.insert(tk.END, f"排量: {data[6]}L\n")
  104. self.detail_text.insert(tk.END, f"变速箱: {data[7]}\n")
  105. self.detail_text.insert(tk.END, f"评分: {data[2]}分\n")
  106. self.detail_text.insert(tk.END, f"销量: {data[3]}\n")
  107. self.detail_text.insert(tk.END, f"排名: {data[1]}\n")
  108. # 加载图片并显示
  109. image_path = data[10] # 假设第11列是图片路径
  110. if image_path: # 确保图片路径不为空
  111. try:
  112. # 打开图片并调整大小
  113. image = Image.open(image_path)
  114. image = image.resize((230, 230)) # 假设图片大小为200x200
  115. image = ImageTk.PhotoImage(image)
  116. self.detail_image_label.config(image=image)
  117. self.detail_image_label.image = image
  118. except Exception as e:
  119. messagebox.showerror("错误", f"无法加载图片: {e}")
  120. def load_data(self):
  121. # 连接数据库
  122. connection = pymysql.connect(host='192.168.111.132', user='root', password='123', db='car')
  123. try:
  124. with connection.cursor() as cursor:
  125. # 定义SQL查询语句,选择所有字段并按照数据库中的顺序排列
  126. sql = "SELECT ranking, car_name, price, hot, brand, style, dispt, gear, pingfen, plrs,images FROM cars"
  127. cursor.execute(sql)
  128. # 获取所有记录
  129. result = cursor.fetchall()
  130. # 将数据添加到Treeview控件
  131. self.tree.delete(*self.tree.get_children())
  132. for row in result:
  133. # 将所有字段插入到Treeview中,按照数据库中的顺序
  134. self.tree.insert('', 'end', values=(
  135. row[1], row[0], row[8], row[9], row[4], row[5], row[6], row[7], row[2], row[3],row[10]))
  136. finally:
  137. connection.close()
  138. def search_keyword(self):
  139. # 获取用户输入的关键字
  140. keyword = self.car_name_var.get()
  141. # 连接到数据库
  142. connection = pymysql.connect(host='192.168.111.132', user='root', password='123', db='car')
  143. try:
  144. # 使用数据库连接创建一个游标对象
  145. with connection.cursor() as cursor:
  146. # 定义SQL查询语句,使用占位符%表示关键字
  147. sql = "SELECT ranking, car_name, price, hot, brand, style, dispt, gear, pingfen, plrs FROM cars WHERE car_name LIKE %s"
  148. # 执行SQL查询,将关键字作为参数传递
  149. cursor.execute(sql, (f"%{keyword}%",))
  150. # 获取查询结果
  151. result = cursor.fetchall()
  152. # 清空Treeview控件中的所有条目
  153. self.tree.delete(*self.tree.get_children())
  154. # 遍历查询结果,将每条记录插入到Treeview控件中
  155. for row in result:
  156. self.tree.insert('', 'end', values=(row[1], row[0], row[8], row[9])) # 假设要显示汽车名称、排名、评分和评论数
  157. finally:
  158. # 关闭数据库连接
  159. connection.close()
  160. def search_rating(self):
  161. # 获取用户选择的变速箱类型
  162. selected_gear = self.gear_var.get()
  163. # 连接到数据库
  164. connection = pymysql.connect(host='192.168.111.132', user='root', password='123', db='car')
  165. try:
  166. # 使用数据库连接创建一个游标对象
  167. with connection.cursor() as cursor:
  168. # 定义SQL查询语句,根据变速箱类型进行分组统计
  169. sql = """
  170. SELECT gear, SUM(`plrs`) AS total_sales,
  171. AVG(`pingfen`) AS average_rating
  172. FROM cars
  173. WHERE gear = %s
  174. GROUP BY gear
  175. """
  176. # 执行SQL查询,将变速箱类型作为参数传递
  177. cursor.execute(sql, (selected_gear,))
  178. # 获取查询结果
  179. result = cursor.fetchone()
  180. if result:
  181. # 插入数据到Treeview控件
  182. self.tree.insert('', 'end', values=(result[0], result[1], result[2]))
  183. finally:
  184. # 关闭数据库连接
  185. connection.close()
  186. def bind_search_methods(self):
  187. # 绑定平均分搜索方法
  188. self.rank_search_button.config(command=self.search_rating) # 确保这里指向正确的搜索方法
  189. # 绑定关键字搜索方法
  190. self.keyword_search_button.config(command=self.search_keyword) # 绑定关键字搜索方法
  191. # # 绑定加载数据方法
  192. self.load_data() # 假设在初始化界面时加载数据
  193. def search_rating(self):
  194. # 获取用户选择的变速箱类型
  195. selected_gear = self.gear_var.get()
  196. # 连接到数据库
  197. connection = pymysql.connect(host='192.168.111.132', user='root', password='123', db='car')
  198. try:
  199. # 使用数据库连接创建一个游标对象
  200. with connection.cursor() as cursor:
  201. # 定义SQL查询语句,根据变速箱类型进行分组统计
  202. sql = """
  203. SELECT gear, SUM(`plrs`) AS total_sales,
  204. AVG(`pingfen`) AS average_rating
  205. FROM cars
  206. WHERE gear = %s
  207. GROUP BY gear
  208. """
  209. # 执行SQL查询,将变速箱类型作为参数传递
  210. cursor.execute(sql, (selected_gear,))
  211. # 获取查询结果
  212. result = cursor.fetchone()
  213. if result:
  214. # 更新销量文本框
  215. self.sales_var.set(result[1])
  216. # 更新评分文本框,确保显示一位小数
  217. self.rating_var.set(f"{result[2]:.1f}")
  218. finally:
  219. # 关闭数据库连接
  220. connection.close()
  221. def start_car_ui():
  222. root = tk.Tk()
  223. app = CarUI(root)
  224. root.mainloop()
  225. if __name__ == "__main__":
  226. start_car_ui()

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/761168
推荐阅读
相关标签
  

闽ICP备14008679号