You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python turtle模块国旗绘制代码运行故障求助

国旗绘制代码Bug修复

问题根因

原代码4类异常的触发原因如下:

  • 画布无内容、窗口崩溃:drawFlag内部嵌套的flag函数末尾无参数调用自身,触发无限递归直接超过Python最大递归深度,程序崩溃;全局变量length=100和drawFlag内部局部变量length=50作用域冲突,矩形绘制尺寸错乱;清屏方法turtle.clear漏写括号,实际未执行清屏逻辑;代码末尾缺少turtle.done()保活,绘制完成后窗口直接销毁。
  • 窗口提前弹出:导入turtle库后立刻实例化Turtle对象,会直接触发画布初始化,早于shell端的输入交互流程。
  • 输入重复打印:代码中存在多处冗余的print(userChoice)语句,获取输入后、分支校验时重复打印输入内容。
  • 全量绘制报错:flag是定义在drawFlag内部的局部函数,makeAllFlags在全局作用域直接调用该函数找不到定义,且调用时未传入要求的三个颜色参数,直接触发名称错误/参数缺失错误。
  • 额外隐藏bug:用户输入判断时未统一转小写,大写开头的输入会校验失败;question.lower()执行后未赋值回原变量,大小写混合的yes/no输入无法正确识别。

修复后完整代码

#####################################################
# Global Variables and Constants
#####################################################
choice = ""
rect_length = 250
rect_height = 50
#####################################################
# Imports
#####################################################
import turtle

#####################################################
# Subprograms
#####################################################
def displayMenu():
    print("可绘制选项:德国(germany)、亚美尼亚(armenia)、荷兰(netherlands)、加蓬(gabon),输入each绘制全部国旗")

def makeRectangle(t, color):
    t.begin_fill()
    t.fillcolor(color)
    t.pencolor(color)
    for i in range(4):
        if i % 2 == 0:
            t.forward(rect_length)
        else:
            t.forward(rect_height)
        t.right(90)
    t.end_fill()

def drawThreeColorFlag(t, start_x, start_y, colorA, colorB, colorC):
    t.penup()
    t.goto(start_x, start_y)
    t.pendown()
    t.setheading(0)
    makeRectangle(t, colorA)
    t.right(90)
    t.forward(rect_height)
    t.left(90)
    makeRectangle(t, colorB)
    t.right(90)
    t.forward(rect_height)
    t.left(90)
    makeRectangle(t, colorC)

def drawSingleFlag(flag_name, t):
    flag_pos_x = -125
    flag_pos_y = 75
    if flag_name in ["germany", "german"]:
        print("正在绘制德国国旗.....")
        drawThreeColorFlag(t, flag_pos_x, flag_pos_y, "#000000", "#FF0000", "#FFCE00")
    elif flag_name in ["armenia", "armenian"]:
        print("正在绘制亚美尼亚国旗.....")
        drawThreeColorFlag(t, flag_pos_x, flag_pos_y, "#FF0000", "#00008B", "#FFBF00")
    elif flag_name in ["netherlands", "dutch"]:
        print("正在绘制荷兰国旗.....")
        drawThreeColorFlag(t, flag_pos_x, flag_pos_y, "#990000", "#FFFFFF", "#004C99")
    elif flag_name in ["gabon", "gabonese"]:
        print("正在绘制加蓬国旗.....")
        drawThreeColorFlag(t, flag_pos_x, flag_pos_y, "#009900", "#CCCC00", "#ADD8E6")

def makeAllFlags(t):
    print("正在绘制全部四面国旗.....")
    # 2x2网格排布四面国旗
    drawThreeColorFlag(t, -300, 200, "#000000", "#FF0000", "#FFCE00")
    drawThreeColorFlag(t, 50, 200, "#FF0000", "#00008B", "#FFBF00")
    drawThreeColorFlag(t, -300, -50, "#009900", "#CCCC00", "#ADD8E6")
    drawThreeColorFlag(t, 50, -50, "#990000", "#FFFFFF", "#004C99")

#####################################################
# Main Program
####################################################
if __name__ == "__main__":
    welcome = "欢迎使用国旗绘制程序!\n"
    print(welcome)
    displayMenu()
    countryList = ["german", "germany", "armenia", "armenian", "netherlands", "dutch", "gabon", "gabonese", "each"]
    while True:
        userChoice = input("请输入要绘制的选项:").strip().lower()
        if userChoice not in countryList:
            print("输入无效,请从给出的选项中选择")
            continue
        # 完成输入交互后再初始化turtle画布,避免窗口提前弹出
        pen = turtle.Turtle()
        pen.speed(5)
        screen = turtle.Screen()
        screen.title("国旗绘制")
        if userChoice == "each":
            makeAllFlags(pen)
        else:
            drawSingleFlag(userChoice, pen)
        pen.hideturtle()
        question = input("是否要绘制其他国旗?(输入yes/no):").strip().lower()
        if question == "yes":
            pen.clear()
            pen.home()
            continue
        else:
            print("感谢使用,再见!")
            turtle.done()
            break

修复说明

  • 移除了原代码中会触发无限递归的嵌套函数无参调用,将三色旗绘制逻辑抽为公共可复用函数,统一尺寸变量作用域,避免全局/局部变量冲突。
  • 调整turtle初始化时机,所有shell端输入交互完成后再创建画笔、弹出画布,符合交互预期。
  • 删除所有冗余的输入打印语句,解决输入重复输出问题。
  • 修正全量绘制逻辑的函数作用域问题,调用时传入正确坐标、颜色参数,四面国旗按网格排布不会重叠。
  • 补全清屏方法的括号、添加画布保活逻辑turtle.done(),修复窗口崩溃问题;统一输入转小写逻辑,所有大小写格式的合法输入都能正常识别。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:30:55