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