当前位置: 首页 > 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

相关文章:

  • Redis 数据类型详解(二):Hash 类型全解析
  • 阿里云服务器深度科普:技术架构与未来图景
  • P4168 [Violet] 蒲公英 Solution
  • Cordova开发自定义插件的方法
  • 我国“东数西算”工程对数据中心布局的长期影响
  • 双目测量中的将视差图重投影成三维坐标图
  • 2025.5.5总结
  • 42. 接雨水(相向双指针/前后缀分解),一篇文章讲透彻
  • 【中间件】brpc_基础_单例
  • Scrapy分布式爬虫实战:高效抓取的进阶之旅
  • 直方图反向投影
  • 多语言笔记系列:Polyglot Notebooks 中运行 BenchmarkDotnet 基准测试
  • Hive安装与配置教程
  • 《冰雪三职业》:战士玩法攻略!
  • UniGetUI 使用指南:轻松管理 Windows 软件(包括CUDA)
  • 模型训练实用之梯度检查点
  • 头歌实验MySQL数据库 - 复杂查询(二)
  • 深入解析Semantic Kernel中的聊天历史记录对象
  • Gradio全解20——Streaming:流式传输的多媒体应用(6)——RT-DETR模型构建视频流目标检测系统
  • STM32教程:DMA原理及结构分析(基于STM32F103C8T6最小系统板标准库开发)*详细教程*
  • 新华每日电讯:上海“绿色大民生”撑起“春日大经济”
  • 马上评|“景区陪爬”能成为新职业吗?
  • 三百余英国王室藏品,一览爱德华时代的优雅
  • 保持高位运行,今天全国铁路预计发送旅客1800万人次
  • 云南省政协原党组成员、秘书长车志敏接受审查调查
  • 英国地方选举结果揭晓,工党保守党皆受挫