# GESP等级：四级 | GESP Python 四级考点
"""
第1节 文件小管家
================
面向7-10岁少儿 —— 用turtle画出"文件读取流程图"
乌龟读文件 → 处理 → 写新文件

知识点：
  - open() 三种模式：r/w/a
  - read() / readline() / write()
  - close() 和 with 语句
  - 文件路径概念
"""

import turtle
import time

# ============================================================
# 第一部分：准备工作 —— 创建示例文件
# ============================================================

def prepare_files():
    """在教学前先创建好需要用到的示例文件"""
    # 故事文件
    with open("story.txt", "w", encoding="utf-8") as f:
        f.write("从前有座山\n")
        f.write("山里有座庙\n")
        f.write("庙里有个老和尚\n")
        f.write("老和尚在给小和尚讲故事\n")
    print("[准备] 已创建 story.txt")

    # 数字文件
    with open("numbers.txt", "w", encoding="utf-8") as f:
        for i in range(1, 6):
            f.write(f"数字{i}\n")
    print("[准备] 已创建 numbers.txt")


# ============================================================
# 第二部分：基础演示函数
# ============================================================

def demo_read_all():
    """演示 read() 读取全部内容"""
    print("\n" + "=" * 40)
    print("【演示】read() —— 一口气读完")
    print("=" * 40)

    with open("story.txt", "r", encoding="utf-8") as f:
        content = f.read()
        print("故事内容是：")
        print(content)


def demo_readline():
    """演示 readline() 逐行读取"""
    print("\n" + "=" * 40)
    print("【演示】readline() —— 一行一行读")
    print("=" * 40)

    with open("story.txt", "r", encoding="utf-8") as f:
        line1 = f.readline()
        print(f"第1行：{line1}", end="")
        line2 = f.readline()
        print(f"第2行：{line2}", end="")
        line3 = f.readline()
        print(f"第3行：{line3}", end="")


def demo_write_and_append():
    """演示 w 模式覆盖 和 a 模式追加"""
    print("\n" + "=" * 40)
    print("【演示】w模式 vs a模式")
    print("=" * 40)

    # w模式：覆盖
    with open("test_w.txt", "w", encoding="utf-8") as f:
        f.write("这是用w模式写的！\n")

    # a模式：追加
    with open("test_w.txt", "a", encoding="utf-8") as f:
        f.write("这是用a模式追加的！\n")

    # 读取验证
    with open("test_w.txt", "r", encoding="utf-8") as f:
        print("文件内容：")
        print(f.read())


def demo_with_statement():
    """演示 with 语句自动关闭文件"""
    print("\n" + "=" * 40)
    print("【演示】with 自动关门")
    print("=" * 40)

    with open("story.txt", "r", encoding="utf-8") as f:
        content = f.read()
        print("文件已经自动打开并读取完毕")
        print(f"共读取了 {len(content)} 个字符")
    # 到这里文件自动关闭
    print("现在文件已自动关闭！")


def demo_file_copy():
    """演示文件复制 —— 读取再写入"""
    print("\n" + "=" * 40)
    print("【演示】文件复制")
    print("=" * 40)

    # 读取原文件
    with open("story.txt", "r", encoding="utf-8") as f:
        content = f.read()

    # 写入新文件
    with open("story_copy.txt", "w", encoding="utf-8") as f:
        f.write(content)

    print("已将 story.txt 复制为 story_copy.txt")

    # 验证
    with open("story_copy.txt", "r", encoding="utf-8") as f:
        print("复制文件的内容：")
        print(f.read())


# ============================================================
# 第三部分：turtle可视化 —— 文件读取流程图
# ============================================================

def setup_screen():
    """设置画布"""
    screen = turtle.Screen()
    screen.title("文件小管家 —— 文件处理流程图")
    screen.bgcolor("lightyellow")
    screen.setup(800, 600)
    return screen


def draw_box(t, x, y, text, color="lightblue", width=180, height=60):
    """画一个带文字的方框"""
    t.penup()
    t.goto(x - width // 2, y - height // 2)
    t.pendown()
    t.fillcolor(color)
    t.begin_fill()
    for _ in range(2):
        t.forward(width)
        t.left(90)
        t.forward(height)
        t.left(90)
    t.end_fill()

    # 写文字
    t.penup()
    t.goto(x, y - 10)
    t.pendown()
    t.color("black")
    t.write(text, align="center", font=("SimHei", 14, "bold"))


def draw_arrow(t, x1, y1, x2, y2, color="gray"):
    """画箭头连接线"""
    t.penup()
    t.goto(x1, y1)
    t.pendown()
    t.color(color)
    t.pensize(3)
    t.setheading(t.towards(x2, y2))
    t.forward(t.distance(x2, y2) - 15)

    # 画箭头头部
    t.left(150)
    t.forward(15)
    t.backward(15)
    t.right(300)
    t.forward(15)
    t.backward(15)


def turtle_demo():
    """用turtle画出文件处理流程"""
    screen = setup_screen()
    t = turtle.Turtle()
    t.speed(3)
    t.hideturtle()

    # 标题
    t.penup()
    t.goto(0, 250)
    t.color("darkblue")
    t.write("文件小管家 —— 文件处理流程", align="center",
            font=("SimHei", 20, "bold"))

    # 第一步：打开文件（open）
    draw_box(t, 0, 150, "① 打开文件\nopen()", "lightcoral")
    time.sleep(1)

    # 第二步：读取文件（read）
    draw_arrow(t, 0, 120, 0, 60)
    draw_box(t, 0, 30, "② 读取内容\nread()", "lightgreen")
    time.sleep(1)

    # 第三步：处理内容（process）
    draw_arrow(t, 0, 0, 0, -60)
    draw_box(t, 0, -90, "③ 处理内容\n处理", "lightyellow")
    time.sleep(1)

    # 第四步：写入文件（write）
    draw_arrow(t, 0, -120, 0, -180)
    draw_box(t, 0, -210, "④ 写入文件\nwrite()", "lightsalmon")
    time.sleep(1)

    # 第五步：关闭文件（close）
    draw_arrow(t, 0, -240, 0, -300)
    draw_box(t, 0, -330, "⑤ 关闭文件\nclose()", "lightgray")
    time.sleep(1)

    # 添加小乌龟动画 —— 沿着流程走
    t2 = turtle.Turtle()
    t2.shape("turtle")
    t2.color("green")
    t2.penup()
    t2.speed(1)

    # 乌龟从打开走到读取
    t2.goto(0, 170)
    t2.pendown()
    t2.goto(0, 120)
    t2.goto(0, 60)
    time.sleep(0.5)

    # 走到处理
    t2.goto(0, 0)
    t2.goto(0, -60)
    time.sleep(0.5)

    # 走到写入
    t2.goto(0, -120)
    t2.goto(0, -180)
    time.sleep(0.5)

    # 走到关闭
    t2.goto(0, -240)
    t2.goto(0, -300)
    time.sleep(0.5)

    # 完成总结
    t2.penup()
    t2.goto(250, -330)
    t2.color("darkgreen")
    t2.write("任务完成！", font=("SimHei", 16, "bold"))

    t.penup()
    t.goto(0, -380)
    t.color("purple")
    t.write("口诀：open→read→write→close，with自动管！",
            align="center", font=("SimHei", 14, "bold"))

    screen.mainloop()


# ============================================================
# 第四部分：互动小游戏 —— 文件模式猜谜
# ============================================================

def mode_quiz():
    """互动问答：猜猜该用什么模式"""
    print("\n" + "=" * 40)
    print("【小游戏】模式猜猜猜")
    print("=" * 40)

    questions = [
        ("我要读取一个文件的内容，用哪个模式？", "r"),
        ("我想写一个新文件，原来的内容不要了，用哪个模式？", "w"),
        ("我想在日记本后面加一句话，用哪个模式？", "a"),
        ("文件必须已经存在才能用的模式是？", "r"),
        ("如果文件不存在会自己创建的模式是？", "w"),
    ]

    score = 0
    for i, (question, answer) in enumerate(questions, 1):
        print(f"\n第{i}题：{question}")
        user_answer = input("请输入 r、w 或 a：").strip().lower()
        if user_answer == answer:
            print("正确！太棒了！")
            score += 1
        else:
            print(f"不对哦，正确答案是：{answer}")

    print(f"\n你答对了 {score}/{len(questions)} 题！")


# ============================================================
# 第五部分：主程序 —— 选择要运行的功能
# ============================================================

def main():
    print("""
    ╔══════════════════════════════════╗
    ║    文件小管家 —— 学习程序        ║
    ╚══════════════════════════════════╝
    """)

    prepare_files()

    while True:
        print("\n请选择要运行的功能：")
        print("1. read() 一口气读完演示")
        print("2. readline() 逐行读取演示")
        print("3. w模式 vs a模式 对比演示")
        print("4. with 自动关门演示")
        print("5. 文件复制演示")
        print("6. turtle画流程图（图形界面）")
        print("7. 模式猜猜猜小游戏")
        print("8. 全部运行")
        print("0. 退出")

        choice = input("\n请输入数字（0-8）：").strip()

        if choice == "1":
            demo_read_all()
        elif choice == "2":
            demo_readline()
        elif choice == "3":
            demo_write_and_append()
        elif choice == "4":
            demo_with_statement()
        elif choice == "5":
            demo_file_copy()
        elif choice == "6":
            print("\n正在打开turtle图形窗口...")
            turtle_demo()
        elif choice == "7":
            mode_quiz()
        elif choice == "8":
            demo_read_all()
            demo_readline()
            demo_write_and_append()
            demo_with_statement()
            demo_file_copy()
            mode_quiz()
        elif choice == "0":
            print("再见！记得复习口诀哦：")
            print("open开门read读，write写入close关，with帮你自动管！")
            break
        else:
            print("输入有误，请重新选择。")


if __name__ == "__main__":
    main()
