代码分享[今天吃什么]
- # -*- coding: utf-8 -*-
- """
- 今天吃什么?
- --------------------------------------------------
- 一个小巧的桌面应用:
- 1. 打开后答案区显示「???」
- 2. 点击「开始」→ 按钮变成「停止」,答案区开始飞速轮播美食
- 3. 点击「停止」→ 定格当前美食,按钮变回「开始」
- 快捷键:空格 = 开始 / 停止,Esc = 退出
- 运行:python what_to_eat.py
- """
- import random
- import tkinter as tk
- # ----------------------------------------------------------------
- # 美食池:想加就加,随便改
- # ----------------------------------------------------------------
- FOODS = [
- # 中式家常
- "火锅", "麻辣烫", "酸菜鱼", "水煮肉片", "回锅肉", "麻婆豆腐",
- "宫保鸡丁", "白切鸡", "小炒肉", "干锅牛蛙", "东北铁锅炖",
- # 面食 & 粉
- "兰州拉面", "重庆小面", "武汉热干面", "炸酱面", "牛肉面",
- "螺蛳粉", "桂林米粉", "云南米线", "羊肉泡馍", "刀削面",
- # 小吃 & 早点
- "沙县小吃", "黄焖鸡米饭", "小笼包", "生煎包", "煎饼果子",
- "肉夹馍", "肠粉", "锅贴", "灌汤包", "包子豆浆",
- # 重口快乐
- "烧烤配啤酒", "炸鸡", "冒菜", "钵钵鸡", "潮汕牛肉火锅",
- "椰子鸡", "烤鱼", "小龙虾", "烤肉自助", "串串香",
- # 异国风味
- "日式咖喱饭", "寿司", "拉面", "韩式拌饭", "部队锅",
- "泰式冬阴功", "越南河粉", "汉堡薯条", "披萨", "意面",
- ]
- # 配色(浅色主题)
- BG = "#FFF8F0" # 背景:暖米白
- CARD = "#FFFFFF" # 卡片
- ACCENT = "#FF6B35" # 主色:番茄红
- ACCENT_DARK = "#E0511C" # 按下
- TEXT = "#2B2B2B" # 主文字
- MUTED = "#9A8F86" # 次要文字
- # 轮播间隔(毫秒),越小切换越快
- TICK_MS = 60
- class WhatToEatApp:
- def __init__(self, root: tk.Tk) -> None:
- self.root = root
- self.rolling = False # 是否正在轮播
- self._after_id = None # after() 的句柄
- self._last = None # 上一次显示的美食,避免连续重复
- self._build_ui()
- self._bind_keys()
- # ------------------------------------------------------------
- # 界面
- # ------------------------------------------------------------
- def _build_ui(self) -> None:
- self.root.title("今天吃什么?")
- self.root.configure(bg=BG)
- self.root.geometry("460x420")
- self.root.minsize(380, 340)
- self._center_window(460, 420)
- # 标题
- tk.Label(
- self.root, text="今 天 吃 什 么 ?",
- font=("Microsoft YaHei UI", 20, "bold"),
- bg=BG, fg=TEXT,
- ).pack(pady=(28, 4))
- tk.Label(
- self.root, text="别纠结了,交给命运",
- font=("Microsoft YaHei UI", 10),
- bg=BG, fg=MUTED,
- ).pack()
- # 答案卡片
- card = tk.Frame(self.root, bg=CARD, highlightthickness=2,
- highlightbackground="#F0E3D8")
- card.pack(fill="both", expand=True, padx=36, pady=22)
- card.pack_propagate(False)
- self.answer_label = tk.Label(
- card, text="???",
- font=("Microsoft YaHei UI", 34, "bold"),
- bg=CARD, fg=ACCENT,
- wraplength=320, justify="center",
- )
- self.answer_label.place(relx=0.5, rely=0.5, anchor="center")
- # 开始 / 停止 按钮
- self.btn = tk.Button(
- self.root, text="开 始",
- font=("Microsoft YaHei UI", 14, "bold"),
- bg=ACCENT, fg="white",
- activebackground=ACCENT_DARK, activeforeground="white",
- relief="flat", cursor="hand2",
- width=14, height=1,
- bd=0, highlightthickness=0,
- command=self.toggle,
- )
- self.btn.pack(ipady=8, pady=(0, 8))
- # 底部提示
- self.hint = tk.Label(
- self.root, text="空格 = 开始 / 停止 Esc = 退出",
- font=("Microsoft YaHei UI", 9),
- bg=BG, fg=MUTED,
- )
- self.hint.pack(pady=(0, 18))
- # 鼠标悬停效果
- self.btn.bind("<Enter>", lambda e: self._hover(True))
- self.btn.bind("<Leave>", lambda e: self._hover(False))
- def _center_window(self, w: int, h: int) -> None:
- sw = self.root.winfo_screenwidth()
- sh = self.root.winfo_screenheight()
- x = (sw - w) // 2
- y = (sh - h) // 3
- self.root.geometry(f"{w}x{h}+{x}+{y}")
- def _bind_keys(self) -> None:
- self.root.bind("<space>", lambda e: self.toggle())
- self.root.bind("<Escape>", lambda e: self.root.destroy())
- def _hover(self, on: bool) -> None:
- if self.rolling:
- return
- self.btn.configure(bg=ACCENT_DARK if on else ACCENT)
- # ------------------------------------------------------------
- # 核心逻辑
- # ------------------------------------------------------------
- def toggle(self) -> None:
- """开始 / 停止 二合一。"""
- if self.rolling:
- self.stop()
- else:
- self.start()
- def start(self) -> None:
- self.rolling = True
- self._last = None
- # 按钮 → 停止
- self.btn.configure(text="停 止", bg="#3C3C3C",
- activebackground="#2A2A2A")
- self.hint.configure(text="点击「停止」定格你的今日美食")
- self._tick()
- def stop(self) -> None:
- self.rolling = False
- if self._after_id is not None:
- self.root.after_cancel(self._after_id)
- self._after_id = None
- # 按钮 → 开始
- self.btn.configure(text="开 始", bg=ACCENT, activebackground=ACCENT_DARK)
- self.hint.configure(text="空格 = 开始 / 停止 Esc = 退出")
- def _tick(self) -> None:
- if not self.rolling:
- return
- self.answer_label.configure(text=self._next_food())
- self._after_id = self.root.after(TICK_MS, self._tick)
- def _next_food(self) -> str:
- """随机取一道,避免和上一次完全相同。"""
- food = random.choice(FOODS)
- while len(FOODS) > 1 and food == self._last:
- food = random.choice(FOODS)
- self._last = food
- return food
- def main() -> None:
- root = tk.Tk()
- WhatToEatApp(root)
- root.mainloop()
- if __name__ == "__main__":
- main()
复制代码 如果有误请
|