当前位置: 首页 > news >正文

Python项目源码60:电影院选票系统1.0(tkinter)

1.功能特点:通常选票系统应该允许用户选择电影、场次、座位,然后显示总价和生成票据。好的,我得先规划一下界面布局。

首先,应该有一个电影选择的列表,可能用下拉菜单Combobox来实现。然后场次时间,可能用几个按钮让用户选择,比如上午、下午、晚上。座位选择部分可能需要用按钮矩阵来表示,每个座位点击可以切换选中状态,颜色变化来反馈。
价格计算方面,不同场次可能有不同的价格,或者不同座位区,比如VIP和普通座价格不同。用户选好座位和场次后,总价要实时更新。另外,还需要一个信息展示的区域,显示订单详情,比如电影名、场次、座位、总价,可能还有一个确认按钮,点击后生成票据。
电影选择:使用下拉菜单选择电影

场次选择:不同场次对应不同基础票价

座位选择:

可视化座位布局(8排12列)

每个座位按钮直接显示 “行-列” 编号(如1-1, 3-5),随机生成已售座位(红色不可选)

可选座位显示为绿色

VIP座位(前两排)额外加价

价格计算:

基础票价根据场次不同

VIP座位额外加价

实时计算总价

订单功能:

确认订单前验证输入

显示详细票据信息

确认后标记座位为已售

支持重置所有选择

2.使用说明:选择要观看的电影,选择观影场次,点击选择座位(黄色表示已选),查看总价并确认订单,确认后已选座位会标记为已售(红色)
3.系统通过颜色区分不同状态:浅绿色:可用座位,黄色:已选座位,红色:已售座位,VIP座位(前两排)自动加价20,基础票价上午场": 35, “下午场”: 45, “晚上场”: 55。
在这里插入图片描述

# -*- coding: utf-8 -*-
# @Author : 小红牛
# 微信公众号:WdPython
import tkinter as tk
from tkinter import ttk, messagebox
import randomclass CinemaTicketSystem:def __init__(self, root):self.root = rootself.root.title("电影院选票系统")self.root.geometry("900x650")# 票价配置self.time_prices = {"上午场": 35, "下午场": 45, "晚上场": 55}self.vip_rows = [0, 1]  # VIP座位行(对应实际显示的第1-2排)self.vip_surcharge = 20  # VIP座位加价# 初始化变量self.selected_seats = set()self.current_movie = tk.StringVar(value='射雕英雄传')self.current_time = tk.StringVar()self.total_price = tk.IntVar(value=0)# 创建界面self.create_widgets()# 初始化座位状态self.initialize_seats()def create_widgets(self):# 电影选择movie_frame = ttk.LabelFrame(self.root, text="选择电影")movie_frame.pack(pady=10, padx=20, fill="x")movies = ["神雕侠侣",  "天龙八部", "倚天屠龙记", "射雕英雄传"]self.movie_combo = ttk.Combobox(movie_frame,textvariable=self.current_movie,values=movies,state="readonly")self.movie_combo.pack(pady=5, padx=10)# 场次选择time_frame = ttk.LabelFrame(self.root, text="选择场次")time_frame.pack(pady=10, padx=20, fill="x")self.time_buttons = []for time in self.time_prices:btn = ttk.Button(time_frame,text=f"{time} ¥{self.time_prices[time]}",command=lambda t=time: self.select_time(t))btn.pack(side="left", padx=5, pady=5)self.time_buttons.append(btn)# 座位图seat_frame = ttk.LabelFrame(self.root, text="选择座位(绿色可选,红色已售,黄色已选)")seat_frame.pack(pady=10, padx=20, fill="both", expand=True)# 添加行列号标识rows, cols = 8, 12self.seat_buttons = []for row in range(rows):row_buttons = []# 添加行号标签ttk.Label(seat_frame, text=f"第{row + 1}排").grid(row=row + 1, column=0, padx=5)for col in range(cols):# 添加列号标签(仅第一行)if row == 0:ttk.Label(seat_frame, text=col + 1).grid(row=0, column=col + 1, pady=5)btn = tk.Button(seat_frame,text=f"{row + 1}-{col + 1}",  # 显示座位编号width=4,relief="groove",command=lambda r=row, c=col: self.toggle_seat(r, c))btn.grid(row=row + 1, column=col + 1, padx=2, pady=2)row_buttons.append(btn)self.seat_buttons.append(row_buttons)# 底部信息栏bottom_frame = ttk.Frame(self.root)bottom_frame.pack(pady=10, padx=20, fill="x")ttk.Label(bottom_frame, text="总金额:").pack(side="left")ttk.Label(bottom_frame, textvariable=self.total_price).pack(side="left")ttk.Button(bottom_frame,text="确认选票",command=self.confirm_order).pack(side="right", padx=10)ttk.Button(bottom_frame,text="重置选择",command=self.reset_selection).pack(side="right")def initialize_seats(self):"""初始化座位状态(随机设置已售座位)"""for row in range(8):for col in range(12):if random.random() < 0.1:  # 10%概率设置为已售self.update_seat_ui(row, col, "red", disabled=True)else:self.update_seat_ui(row, col, "lightgreen")def update_seat_ui(self, row, col, color, disabled=False):"""统一更新座位UI状态"""btn = self.seat_buttons[row][col]btn.config(bg=color)btn["state"] = "disabled" if disabled else "normal"def select_time(self, time):"""选择场次"""self.current_time.set(time)self.calculate_price()def toggle_seat(self, row, col):"""切换座位选择状态"""btn = self.seat_buttons[row][col]seat_id = f"{row + 1}-{col + 1}"if btn["state"] == "disabled":returnif seat_id in self.selected_seats:self.selected_seats.remove(seat_id)self.update_seat_ui(row, col, "lightgreen")else:self.selected_seats.add(seat_id)self.update_seat_ui(row, col, "yellow")self.calculate_price()def calculate_price(self):"""计算总价格"""base_price = self.time_prices.get(self.current_time.get(), 0)total = 0for seat in self.selected_seats:row = int(seat.split("-")[0]) - 1  # 转换为索引从0开始price = base_priceif row in self.vip_rows:price += self.vip_surchargetotal += priceself.total_price.set(total)def confirm_order(self):"""确认订单"""if not self.current_movie.get():messagebox.showwarning("警告", "请先选择电影")returnif not self.current_time.get():messagebox.showwarning("警告", "请先选择场次")returnif not self.selected_seats:messagebox.showwarning("警告", "请至少选择一个座位")return# 生成票据信息ticket_info = [f"电影:{self.current_movie.get()}",f"场次:{self.current_time.get()}",f"座位:{', '.join(sorted(self.selected_seats))}",f"总价:¥{self.total_price.get()}"]# 显示确认对话框if messagebox.askyesno("确认订单", "\n".join(ticket_info)):# 标记已选座位为已售for seat in self.selected_seats:row, col = map(lambda x: int(x) - 1, seat.split("-"))self.update_seat_ui(row, col, "red", disabled=True)self.reset_selection()def reset_selection(self):"""重置所有选择"""for seat in self.selected_seats:row, col = map(lambda x: int(x) - 1, seat.split("-"))if self.seat_buttons[row][col]["state"] != "disabled":self.update_seat_ui(row, col, "lightgreen")self.selected_seats.clear()self.current_time.set("")self.current_movie.set("")self.total_price.set(0)if __name__ == "__main__":root = tk.Tk()app = CinemaTicketSystem(root)root.mainloop()

完毕!!感谢您的收看

----------★★跳转到历史博文集合★★----------
我的零基础Python教程,Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具 NumPy Pygame

http://www.xdnf.cn/news/291763.html

相关文章:

  • C++ 运算符重载详解:赋予自定义类型原生操作的能力
  • PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比
  • 责任链模式(Chain of Responsibility Pattern)
  • SpringCloud多环境配置的一些问题
  • 如何解析CAN报文物理值是负数的信号
  • 如何选择适合自己的LLM
  • 互联网大厂Java求职面试:高并发系统设计与架构实战
  • LeetCode热题100--189.轮转数组--中等
  • 人工智能应用:从技术突破到生态重构的演进之路
  • 【datawhaleAI春训营】楼道图像分类
  • 标题:试验台铁地板:革新之路
  • ARM子程序和栈
  • 第18章:赤色世界:文明的分支与新纪元
  • 雷电模拟器-超好用的Windows安卓模拟器
  • 以太网协议(IEEE 802.3)
  • 数据类型:String
  • 低功耗蓝牙BLE的通信可靠性分析
  • 内存碎片深度剖析
  • 多图详解VSCode搭建Python开发环境
  • BC8 十六进制转十进制
  • Vite 的工作流程
  • 大模型推理框架简介
  • 算法每日一题 | 入门-顺序结构-上学迟到
  • Linux 系统的指令详解介绍
  • 数据融合(Data Fusion)的概念与核心思想
  • DeepSeek-Prover-V2,DeepSeek推出的开源数学推理大模型
  • 实验4 mySQL查询和视图
  • MinIO实现https访问
  • Spring中的控制反转和依赖注入(IoC和DI)以及常见面试题
  • QTtricks