文章目录
- 一、内容简介
- 二、功能浏览
- 三、代码展示
- 四、结语
一、内容简介
本文主要设计了一款根据游戏《猛兽派对》各个角色进行分类的python程序,提供玩家完成每周任务、大逃杀等多种游戏需要,并设计了较为优美的操作界面,便于玩家选择、查看。(版本 2024.11.06)1
同时,文末给出了一系列相关的素材图片和字体文件便于大家进行设计和扩展。
二、功能浏览
- 界面展示
- 多选重叠
- Not Found提示
三、代码展示
import matplotlib
import tkinter as tk
from PIL import Image, ImageTk
from pathlib import Path
def main():
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False
root = tk.Tk()
root.state('zoomed')
root.title("猛兽选择器")
# 加载标题图片
title_photo = ImageTk.PhotoImage(file="images/title.png")
bg_image_right = ImageTk.PhotoImage(file="images/background.png")
canvas = tk.Canvas(root, width=root.winfo_screenwidth(), height=root.winfo_screenheight())
canvas.pack(fill="both", expand=True)
canvas.create_image(0, 0, image=title_photo, anchor="nw")
main_frame = tk.Frame(canvas, bg='#FEF7E2')
main_frame.place(x=250, y=0, width=200, height=root.winfo_screenheight())
image_frame = tk.Frame(canvas, bg='#FEF7E2')
image_frame.place(x=440, y=0, width=root.winfo_screenwidth() - 440, height=root.winfo_screenheight())
bg_label = tk.Label(image_frame, image=bg_image_right)
bg_label.place(x=0, y=0, relwidth=1, relheight=1)
bg_label.image = bg_image_right
# 复选框选项配置
options = [
("犬科动物", tk.BooleanVar()),
("猫科动物", tk.BooleanVar()),
("食草动物", tk.BooleanVar()),
("食肉动物", tk.BooleanVar()),
("会潜水", tk.BooleanVar()),
("会飞行", tk.BooleanVar()),
("有角", tk.BooleanVar()),
("大眼睛", tk.BooleanVar()),
("毛茸茸", tk.BooleanVar()),
("会下蛋", tk.BooleanVar()),
("尾巴长", tk.BooleanVar())
]
# 动物数据
animals_list = {
"犬科动物": ["尼莫", "斯帕奇", "八公", "珞珞", "毛毛", "麦克斯", "白菜狗", "卡托", "雪诺",
"桑尼", "山姆", "哈士企", "罗恩", "斯黛拉"],
"猫科动物": ["玛奇朵", "泰哥", "加肥", "利威尔", "希子", "嘟嘟", "玛奈奇", "苗苗", "星期天"],
"食草动物": ["卡洛特", "培根", "芭比", "瓦力", "莫斯", "阿瓜", "阿呆", "柯蒂斯", "白菜狗", "咕咕", "优罗莎",
"宝伯", "小新", "可乐", "高非", "奥姆诺姆", "豆豆", "福吉", "福宝"],
"食肉动物": ["尼莫", "鳄霸", "地包天", "玛奇朵", "瓦特", "泰哥", "斯帕奇", "图斯卡尔", "八公",
"加肥", "珞珞", "木木", "毛毛", "麦克斯", "锤子", "利威尔", "布鲁斯", "希子", "卡托",
"雪诺", "嘟嘟", "刺头", "桑尼", "玛奈奇", "山姆", "哈士企", "苗苗", "星期天", "罗恩", "斯黛拉"],
"会潜水": ["鳄霸", "瓦特", "阿瓜", "阿呆", "图斯卡尔", "锤子", "布鲁斯", "阿宝", "哈士企"],
"会飞行": ["阿瓜", "阿呆", "木木", "咕咕", "优罗莎", "暴莉", "阿宝"],
"有角": ["地包天", "瓦力", "莫斯", "柯蒂斯", "暴莉", "咩咩", "阿宝"],
"大眼睛": ["鳄霸", "地包天", "阿瓜", "木木", "柯蒂斯", "咕咕", "奥里", "咩咩", "嘟嘟", "阿宝", "奥姆诺姆",
"豆豆", "哈士企"],
"毛茸茸": ["尼莫", "玛奇朵", "卡洛特", "瓦特", "泰哥", "芭比", "瓦力", "莫斯", "八公", "加肥", "珞珞",
"毛毛", "麦克斯", "利威尔", "希子", "卡托", "宝伯", "咩咩", "雪诺", "嘟嘟", "刺头", "可乐", "阿宝",
"高非", "玛奈奇", "山姆", "福吉", "福宝", "哈士企", "苗苗", "星期天", "罗恩", "斯黛拉"],
"会下蛋": ["鳄霸", "地包天", "阿瓜", "阿呆", "木木", "柯蒂斯", "锤子", "咕咕", "布鲁斯", "阿宝", "豆豆",
"泰雷斯"],
"尾巴长": ["鳄霸", "地包天", "玛奇朵", "泰哥", "斯帕奇", "八公", "加肥", "珞珞", "毛毛", "麦克斯", "柯蒂斯",
"锤子", "利威尔", "咕咕", "布鲁斯", "奥里", "希子", "卡托", "雪诺", "嘟嘟", "阿宝", "玛奈奇", "山姆",
"福吉", "苗苗", "星期天"]
}
IMAGE_SIZE = (95, 120)
COLUMNS = 9
photo_cache = {}
current_labels = []
def clear_images():
for label in current_labels:
label.destroy()
current_labels.clear()
def load_image(animal):
if animal not in photo_cache:
try:
path = Path(f"images/{animal}.png")
img = Image.open(path).resize(IMAGE_SIZE, Image.Resampling.LANCZOS)
photo_cache[animal] = ImageTk.PhotoImage(img)
except Exception as e:
print(f"无法加载 {animal} 的图片: {str(e)}")
return None
return photo_cache[animal]
def show_images(animals):
clear_images()
if not animals:
not_found_image = tk.PhotoImage(file="images/notfound.png")
label = tk.Label(image_frame, image=not_found_image, bg='#FEF7E2')
label.place(x=0, y=0, relwidth=1, relheight=1)
label.image = not_found_image
current_labels.append(label)
return
for idx, animal in enumerate(sorted(animals)):
row = idx // COLUMNS
col = idx % COLUMNS
photo = load_image(animal)
if not photo:
continue
container = tk.Frame(image_frame, bg='#FEF7E2')
container.grid(row=row * 2, column=col, padx=10, pady=10)
# 显示图片
img_label = tk.Label(container, image=photo, bg='#FEF7E2')
img_label.pack()
# 显示动物名称
name_label = tk.Label(container, text=animal, font=("汉仪正圆-85W", 14),
bg='#fff1da', fg='#333333')
name_label.pack()
current_labels.extend([container, img_label, name_label])
def animals():
selected_options = [text for text, var in options if var.get()]
if not selected_options:
show_images(set())
return
animal_sets = [set(animals_list[option]) for option in selected_options]
result = set.intersection(*animal_sets)
# print(selected_options)
# print(result)
show_images(result)
# 创建复选框
for text, var in options:
cb = tk.Checkbutton(
main_frame,
text=text,
variable=var,
anchor="w",
justify="left",
padx=10,
pady=14,
font=("方正兰亭圆简体_特", 25, "bold"),
fg="#2B2D30",
bg="#FEF7E2",
activebackground="#DCA65E",
command=animals,
highlightthickness=0,
borderwidth=0
)
cb.pack(side=tk.TOP, fill=tk.X)
root.mainloop()
if __name__ == "__main__":
main()
四、结语
该程序复用性较好,若有后续更新,大家可自己在复选框选项配置
一类中增添分类;在相应的动物数据
后添加对应名字,添加图片到images文件夹
(命名规则:对应名字.png)。
素材以及images文件夹:链接: 百度网盘 提取码: mspd