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
相关产品推荐
相关产品推荐

