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.mzph.cn/web/78641.shtml

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

相关文章

【全队项目】智能学术海报生成系统PosterGenius--图片布局生成模型LayoutPrompt(2)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;大模型实战训练营_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

Linux的时间同步服务器(附加详细实验案例)

一、计时方式的发展 1.古代计时方式​ 公元前约 2000 年&#xff1a;古埃及人利用光线留下的影子计时&#xff0c;他们修建高耸的大型方尖碑&#xff0c;通过追踪方尖碑影子的移动判断时间&#xff0c;这是早期利用自然现象计时的典型方式 。​商朝时期&#xff1a;人们开发并…

【无需docker】mac本地部署dify

环境安装准备 #安装 postgresql13 brew install postgresql13 #使用zsh的在全局添加postgresql命令集 echo export PATH"/usr/local/opt/postgresql13/bin:$PATH" >> ~/.zshrc # 使得zsh的配置修改生效 source ~/.zshrc # 启动postgresql brew services star…

(5)概述 QT 的元对象系统里的类的调用与联系,及访问接口

&#xff08;1&#xff09; QT 的元对象系统&#xff0c;这几个字大家都知道&#xff0c;那么 QT 的元对象系统里都包含哪些内容呢&#xff0c;其访问接口是如何呢&#xff1f; 从 QObject 类的实现里&#xff0c;从其数据成员里就可以看出来&#xff1a; QT 里父容器可以释放其…

打包 Python 项目为 Windows 可执行文件:高效部署指南

Hypackpy 是一款由白月黑羽开发的 Python 项目打包工具&#xff0c;它与 PyInstaller 等传统工具不同&#xff0c;通过直接打包解释器环境和项目代码&#xff0c;并允许开发者修改配置文件以排除不需要的内容&#xff0c;从而创建方便用户一键运行的可执行程序。以下是使用 Hyp…

MySQL JOIN详解:掌握数据关联的核心技能

一、为什么需要JOIN&#xff1f; 在关系型数据库中&#xff0c;数据通常被拆分到不同的表中以提高存储效率。当我们需要从多个表中组合数据时&#xff0c;JOIN操作就成为了最关键的技能。通过本文&#xff0c;您将全面掌握MySQL中7种JOIN操作&#xff0c;并学会如何在实际场景中…

Kdump 收集器及使用方式

以下是 Linux 系统中 Kdump 转储收集器的详细说明及其使用方法&#xff0c;涵盖核心工具、配置方法及实际示例&#xff1a; 一、Kdump 收集器分类及作用 Kdump 的核心功能是通过 捕获内核 生成内存转储文件&#xff08;vmcore&#xff09;&#xff0c;其核心收集器包括&#…

Error: error:0308010C:digital envelope routines::unsupported 高版本node启动低版本项目运行报错

我的问题就是高版本node启动旧版本项目引起的问题&#xff0c;单独在配置 package.json文件中配置并运行就可以&#xff0c;大概意思就是设置node的openssl "scripts": {"dev": "SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-servi…

松下机器人快速入门指南(2025年更新版)

松下机器人快速入门指南&#xff08;2025年更新版&#xff09; 松下机器人以其高精度、稳定性和易用性在工业自动化领域广泛应用。本文将从硬件配置、参数设置、手动操作、编程基础到维护保养&#xff0c;全面讲解松下机器人的快速入门方法&#xff0c;帮助新手快速掌握核心操…

【CISCO】Se2/0, Se3/0:串行口(Serial) 这里串口的2/0 和 3/0分别都是什么?

在 Cisco IOS 设备上&#xff0c;接口名称通常遵循这样一个格式&#xff1a; <类型><槽号>/<端口号>类型&#xff08;Type&#xff09;&#xff1a;表示接口的物理或逻辑类型&#xff0c;比如 Serial&#xff08;串行&#xff09;、FastEthernet、GigabitEt…

开源无人机地面站QGroundControl安卓界面美化与逻辑优化实战

QGroundControl作为开源无人机地面站软件,其安卓客户端界面美化与逻辑优化是提升用户体验的重要工程。 通过Qt框架的界面重构和代码逻辑优化,可以实现视觉升级与性能提升的双重目标。本文将系统讲解QGC安卓客户端的二次开发全流程,包括开发环境搭建、界面视觉升级、多分辨率…

基于DDPG的自动驾驶小车绕圈任务

1.任务介绍 任务来源: DQN: Deep Q Learning &#xff5c;自动驾驶入门&#xff08;&#xff1f;&#xff09; &#xff5c;算法与实现 任务原始代码: self-driving car 在上一篇使用了DQN算法完成自动驾驶小车绕圈任务之后&#xff0c;学习了DDPG算法&#xf…

缓存置换:用c++实现最近最少使用(LRU)算法

在计算机的世界里&#xff0c;缓存就像一个“快速仓库”&#xff0c;它存储着我们频繁访问的数据&#xff0c;大大提升了数据的读取速度。但这个 “仓库” 空间有限&#xff0c;当它被装满时&#xff0c;就得决定舍弃一些数据&#xff0c;为新数据腾出位置&#xff0c;这个决策…

【YOLO11改进】改进Conv、颈部网络STFEN、以及引入PIOU用于小目标检测!

改进后的整体网络架构 改进一:RFD模块(Conv) YOLOv11模型的跨步卷积下采样虽然快速聚合了局部特征,并且实现了较高的计算效率,但其固有的信息压缩机制会导致细粒度特征的不可逆丢失。针对特征保留与计算效率的平衡问题,本文采用RFD模块替换跨步卷积下采样模块。RFD模块通…

设计模式每日硬核训练 Day 18:备忘录模式(Memento Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 17&#xff1a;中介者模式小结 在 Day 17 中&#xff0c;我们学习了中介者模式&#xff08;Mediator Pattern&#xff09;&#xff1a; 用一个中介者集中管理对象之间的通信。降低对象之间的耦合&#xff0c;适用于聊天系统、GUI 控件联动、塔台调度等…

java单元测试代码

import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; import java.util.List;public class UserServiceTest {Testpublic void testSearchUserByTags() {// 模拟标签列表List<String> tagNameList List.of("tag1", "…

前端面经-VUE3篇(一)--vue3基础知识- 插值表达式、ref、reactive

目录 一、 插值表达式 1、插值表达式 ({{}}) 的本质与作用&#xff1a; 2、与 Vue 响应式系统关系&#xff1a; 二、指令 1、什么是 Vue 指令&#xff1f; 2、指令的分类 1、内置指令 ① 内容绑定&#xff1a;v-text 和 v-html ② 属性绑定&#xff1a;v-bind ③ 事件绑定…

矩阵置零(中等)

可以用两个标记数组分别记录每一行和每一列是否有零出现。 首先遍历该数组一次&#xff0c;如果某个元素为 0&#xff0c;那么就将该元素所在的行和列所对应标记数组的位置置为 true。然后再次遍历该数组&#xff0c;用标记数组更新原数组。 class Solution {public void set…

Android 实现一个隐私弹窗

效果图如下&#xff1a; 1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数 2. 《用户协议》、《隐私政策》设置成可点击的&#xff0c;且颜色要区分出来 res/layout/dialog_privacy_policy.xml 文件 <?xml version"1.0" encoding"utf-8"?&…

TCP概念+模拟tcp服务器及客户端

目录 一、TCP基本概念 二、ser服务器代码 三、cil客户端代码 四、面试常问问题 4.1 TCP的可靠性怎么保证或怎么实现? 4.2 具体说一下滑动窗口 一、TCP基本概念 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可…