测试2下
Python

测试2下

[复制链接]
windows31415926 windows31415926 5 小时前 24 阅读
[#] [#]
代码分享[今天吃什么]
  1. # -*- coding: utf-8 -*-
  2. """
  3. 今天吃什么?
  4. --------------------------------------------------
  5. 一个小巧的桌面应用:
  6. 1. 打开后答案区显示「???」
  7. 2. 点击「开始」→ 按钮变成「停止」,答案区开始飞速轮播美食
  8. 3. 点击「停止」→ 定格当前美食,按钮变回「开始」

  9. 快捷键:空格 = 开始 / 停止,Esc = 退出
  10. 运行:python what_to_eat.py
  11. """

  12. import random
  13. import tkinter as tk

  14. # ----------------------------------------------------------------
  15. # 美食池:想加就加,随便改
  16. # ----------------------------------------------------------------
  17. FOODS = [
  18.     # 中式家常
  19.     "火锅", "麻辣烫", "酸菜鱼", "水煮肉片", "回锅肉", "麻婆豆腐",
  20.     "宫保鸡丁", "白切鸡", "小炒肉", "干锅牛蛙", "东北铁锅炖",
  21.     # 面食 & 粉
  22.     "兰州拉面", "重庆小面", "武汉热干面", "炸酱面", "牛肉面",
  23.     "螺蛳粉", "桂林米粉", "云南米线", "羊肉泡馍", "刀削面",
  24.     # 小吃 & 早点
  25.     "沙县小吃", "黄焖鸡米饭", "小笼包", "生煎包", "煎饼果子",
  26.     "肉夹馍", "肠粉", "锅贴", "灌汤包", "包子豆浆",
  27.     # 重口快乐
  28.     "烧烤配啤酒", "炸鸡", "冒菜", "钵钵鸡", "潮汕牛肉火锅",
  29.     "椰子鸡", "烤鱼", "小龙虾", "烤肉自助", "串串香",
  30.     # 异国风味
  31.     "日式咖喱饭", "寿司", "拉面", "韩式拌饭", "部队锅",
  32.     "泰式冬阴功", "越南河粉", "汉堡薯条", "披萨", "意面",
  33. ]

  34. # 配色(浅色主题)
  35. BG = "#FFF8F0"          # 背景:暖米白
  36. CARD = "#FFFFFF"        # 卡片
  37. ACCENT = "#FF6B35"      # 主色:番茄红
  38. ACCENT_DARK = "#E0511C"  # 按下
  39. TEXT = "#2B2B2B"        # 主文字
  40. MUTED = "#9A8F86"       # 次要文字

  41. # 轮播间隔(毫秒),越小切换越快
  42. TICK_MS = 60


  43. class WhatToEatApp:
  44.     def __init__(self, root: tk.Tk) -> None:
  45.         self.root = root
  46.         self.rolling = False          # 是否正在轮播
  47.         self._after_id = None         # after() 的句柄
  48.         self._last = None             # 上一次显示的美食,避免连续重复

  49.         self._build_ui()
  50.         self._bind_keys()

  51.     # ------------------------------------------------------------
  52.     # 界面
  53.     # ------------------------------------------------------------
  54.     def _build_ui(self) -> None:
  55.         self.root.title("今天吃什么?")
  56.         self.root.configure(bg=BG)
  57.         self.root.geometry("460x420")
  58.         self.root.minsize(380, 340)
  59.         self._center_window(460, 420)

  60.         # 标题
  61.         tk.Label(
  62.             self.root, text="今 天 吃 什 么 ?",
  63.             font=("Microsoft YaHei UI", 20, "bold"),
  64.             bg=BG, fg=TEXT,
  65.         ).pack(pady=(28, 4))

  66.         tk.Label(
  67.             self.root, text="别纠结了,交给命运",
  68.             font=("Microsoft YaHei UI", 10),
  69.             bg=BG, fg=MUTED,
  70.         ).pack()

  71.         # 答案卡片
  72.         card = tk.Frame(self.root, bg=CARD, highlightthickness=2,
  73.                         highlightbackground="#F0E3D8")
  74.         card.pack(fill="both", expand=True, padx=36, pady=22)
  75.         card.pack_propagate(False)

  76.         self.answer_label = tk.Label(
  77.             card, text="???",
  78.             font=("Microsoft YaHei UI", 34, "bold"),
  79.             bg=CARD, fg=ACCENT,
  80.             wraplength=320, justify="center",
  81.         )
  82.         self.answer_label.place(relx=0.5, rely=0.5, anchor="center")

  83.         # 开始 / 停止 按钮
  84.         self.btn = tk.Button(
  85.             self.root, text="开 始",
  86.             font=("Microsoft YaHei UI", 14, "bold"),
  87.             bg=ACCENT, fg="white",
  88.             activebackground=ACCENT_DARK, activeforeground="white",
  89.             relief="flat", cursor="hand2",
  90.             width=14, height=1,
  91.             bd=0, highlightthickness=0,
  92.             command=self.toggle,
  93.         )
  94.         self.btn.pack(ipady=8, pady=(0, 8))

  95.         # 底部提示
  96.         self.hint = tk.Label(
  97.             self.root, text="空格 = 开始 / 停止      Esc = 退出",
  98.             font=("Microsoft YaHei UI", 9),
  99.             bg=BG, fg=MUTED,
  100.         )
  101.         self.hint.pack(pady=(0, 18))

  102.         # 鼠标悬停效果
  103.         self.btn.bind("<Enter>", lambda e: self._hover(True))
  104.         self.btn.bind("<Leave>", lambda e: self._hover(False))

  105.     def _center_window(self, w: int, h: int) -> None:
  106.         sw = self.root.winfo_screenwidth()
  107.         sh = self.root.winfo_screenheight()
  108.         x = (sw - w) // 2
  109.         y = (sh - h) // 3
  110.         self.root.geometry(f"{w}x{h}+{x}+{y}")

  111.     def _bind_keys(self) -> None:
  112.         self.root.bind("<space>", lambda e: self.toggle())
  113.         self.root.bind("<Escape>", lambda e: self.root.destroy())

  114.     def _hover(self, on: bool) -> None:
  115.         if self.rolling:
  116.             return
  117.         self.btn.configure(bg=ACCENT_DARK if on else ACCENT)

  118.     # ------------------------------------------------------------
  119.     # 核心逻辑
  120.     # ------------------------------------------------------------
  121.     def toggle(self) -> None:
  122.         """开始 / 停止 二合一。"""
  123.         if self.rolling:
  124.             self.stop()
  125.         else:
  126.             self.start()

  127.     def start(self) -> None:
  128.         self.rolling = True
  129.         self._last = None
  130.         # 按钮 → 停止
  131.         self.btn.configure(text="停 止", bg="#3C3C3C",
  132.                            activebackground="#2A2A2A")
  133.         self.hint.configure(text="点击「停止」定格你的今日美食")
  134.         self._tick()

  135.     def stop(self) -> None:
  136.         self.rolling = False
  137.         if self._after_id is not None:
  138.             self.root.after_cancel(self._after_id)
  139.             self._after_id = None
  140.         # 按钮 → 开始
  141.         self.btn.configure(text="开 始", bg=ACCENT, activebackground=ACCENT_DARK)
  142.         self.hint.configure(text="空格 = 开始 / 停止      Esc = 退出")

  143.     def _tick(self) -> None:
  144.         if not self.rolling:
  145.             return
  146.         self.answer_label.configure(text=self._next_food())
  147.         self._after_id = self.root.after(TICK_MS, self._tick)

  148.     def _next_food(self) -> str:
  149.         """随机取一道,避免和上一次完全相同。"""
  150.         food = random.choice(FOODS)
  151.         while len(FOODS) > 1 and food == self._last:
  152.             food = random.choice(FOODS)
  153.         self._last = food
  154.         return food


  155. def main() -> None:
  156.     root = tk.Tk()
  157.     WhatToEatApp(root)
  158.     root.mainloop()


  159. if __name__ == "__main__":
  160.     main()

复制代码
如果有误请
windows314159266
关注公众号

可以向站长提建议哦,E-mail:3821743563@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
返回顶部