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 random

class CinemaTicketSystem:
    def __init__(self, root):
        self.root = root
        self.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, 12
        self.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":
            return

        if 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 = 0

        for seat in self.selected_seats:
            row = int(seat.split("-")[0]) - 1  # 转换为索引从0开始
            price = base_price
            if row in self.vip_rows:
                price += self.vip_surcharge
            total += price

        self.total_price.set(total)

    def confirm_order(self):
        """确认订单"""
        if not self.current_movie.get():
            messagebox.showwarning("警告", "请先选择电影")
            return
        if not self.current_time.get():
            messagebox.showwarning("警告", "请先选择场次")
            return
        if 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值