返回

Python Turtle画图窗口不显示?原因及解决办法

python

Python Turtle 画图:窗口不显示的解决办法

最近有些刚学 Python 的朋友,在使用 Turtle 库画图的时候遇到一个问题:代码运行完了,但是画图的窗口没弹出来。就像下面这段代码:

import turtle #acutally called turtle to draw a turtle beautiful also used 
to draw other stuff

 # to draw a square or eventually a turtle you need to do this things below
  # to draw a square you want to : move forward,turn right,move forward,turn 
 right,move forward turn right
def draw_square(): #draw square for turtles
    window = turtle.Screen() #this is the background where the turtle will 
  move
    window.bgcolor("red") # the color of the screen
    brad = turtle.Turtle() #this is how to start drawing like time.sleep you use turtle.Turtle
    brad.forward(100)#move turtle forward takes in a number which is the distance to move forward
    brad.forward(90)# moves right 
    brad.forward(100)
    brad.forward(90)
    brad.forward(100)
    brad.forward(90)
    brad.forward(100)
    brad.forward(90)
    window.exitonclick() #click the screen to close it
    draw_square()

明明代码看起来没问题,也没报错,但就是看不到窗口。别急,接下来咱们就一起看看这是咋回事,以及怎么解决。

一、问题分析:代码执行太快了!

最可能的原因就是:程序跑得太快,画完就自动关了,你还没来得及看清,它就结束了。 你可以把程序想象成一个画图的小人,它得按照你的指示一步步来。turtle.Screen()创建了画布, turtle.Turtle()叫出了画图小人 brad 。 但是你写了八次 brad.forward(..) 相当于让这个小人, 动了八次,虽然改变了位置,但并没有转向。并且, 在调用draw_square()的时候,window.exitonclick()直接就属于调用状态,实际上可能执行的时候在绘图命令之前,导致窗口创建完,遇到这一句,直接可以退出了。

二、 解决方案

既然是程序跑太快导致的问题, 那就有很多简单方法让窗口留着。

1. 调整window.exitonclick()位置:

这是最简单,也是推荐的解决办法。 把 window.exitonclick()这行代码放到 draw_square()函数定义的最后面, 让它在所有绘图操作完成后再执行。

  • 原理: window.exitonclick() 的作用是让窗口保持打开状态,直到你点击窗口才关闭。 原来的代码写的不太对, 导致提前退出了。放到绘图结束后面,就能保证窗口在绘图完成后才等待关闭。

  • 代码示例:

    import turtle
    
    def draw_square():
        window = turtle.Screen()
        window.bgcolor("red")
        brad = turtle.Turtle()
        brad.forward(100)
        brad.right(90)  # 转向!
        brad.forward(100)
        brad.right(90)
        brad.forward(100)
        brad.right(90)
        brad.forward(100)
        brad.right(90)
        window.exitonclick()
    
    draw_square()
    

2. 使用 turtle.done()

turtle.done() 也可以让程序保持运行,直到手动关闭窗口。

  • 原理: turtle.done() 会让 Turtle 图形窗口保持打开状态,直到用户手动关闭它。 它实际上是 turtle.mainloop() 的别名,作用是进入 Turtle 的主事件循环。

  • 代码示例:

    import turtle
    
    def draw_square():
        window = turtle.Screen()
        window.bgcolor("red")
        brad = turtle.Turtle()
        brad.forward(100)
        brad.right(90)
        brad.forward(100)
        brad.right(90)
        brad.forward(100)
        brad.right(90)
        brad.forward(100)
        brad.right(90)
    
    draw_square()
    turtle.done() # 或者 turtle.mainloop()
    

3. 循环绘制(解决根本问题):

既然要画一个正方形,我们发现绘制过程实际上重复了多次相同操作。把重复的工作交给循环。
* 原理 :通过循环,减少重复代码,提高效率。循环4次,每次都前进,然后右转。
* 代码

    ```python
    import turtle

    def draw_square():
        window = turtle.Screen()
        window.bgcolor("red")
        brad = turtle.Turtle()
       
        for _ in range(4): # 循环四次画一个正方形
            brad.forward(100)
            brad.right(90)
        
        window.exitonclick()

    draw_square()
    ```

4. 添加延迟(不推荐,仅作演示):

你可以在代码最后加上 time.sleep() 来让程序暂停一段时间。

  • 原理: time.sleep(seconds) 可以让程序暂停指定的秒数。比如 time.sleep(5) 就是暂停 5 秒。

  • 代码示例:

    import turtle
    import time # 需要导入 time 模块
    
    def draw_square():
        window = turtle.Screen()
        window.bgcolor("red")
        brad = turtle.Turtle()
         for _ in range(4):
            brad.forward(100)
            brad.right(90)
    
    draw_square()
    time.sleep(5)  # 程序暂停 5

    注意: 这种方法只是让程序暂停,窗口还是会一闪而过,然后停在那里。不太优雅,而且在暂停期间程序无法响应其他操作,一般只用于简单调试。

三. 进阶技巧:画笔的更多设置

turtle画图有很多设置,我们这里可以稍微设置一下,增加效果。

  1. brad.speed() 可以控制画图速度,用数字表示速度。
  2. brad.color() 改变画笔颜色,括号里可以使用颜色的英文单词,或者使用RGB颜色。
  3. brad.shape()可以改变画笔的形状,默认为"arrow",还有"turtle", "circle", "square", "triangle", "classic" 可以使用。
  4. 使用 brad.pensize() 修改画笔粗细。

举个例子:

import turtle

def draw_square():
    window = turtle.Screen()
    window.bgcolor("lightgreen") #换个背景颜色
    brad = turtle.Turtle()
    brad.shape("turtle") #把画笔变成小海龟
    brad.color("blue")   # 画笔变蓝色
    brad.speed(2)       # 速度调慢一点,别太快
    brad.pensize(3)     # 画笔粗一点
    for _ in range(4):
        brad.forward(100)
        brad.right(90)
    window.exitonclick()

draw_square()

我们用了一些属性,调整了一些小细节,是不是就丰富多了。

四、画其他图形和有趣的操作

有了画正方形的基础,画其他图形也很简单。比如:

  • 画圆: brad.circle(radius)radius 是半径。

  • 画三角形: 通过控制角度,例如等边三角形, 每次都左转120度, 循环三次:

     for _ in range(3):
          brad.forward(100)
          brad.left(120)
    
  • 画多个图形: 通过在不同位置画多个图形。

    import turtle
    
    window = turtle.Screen()
    window.bgcolor("lightgreen")
    
    # 画第一个正方形
    square1 = turtle.Turtle()
    square1.color("blue")
    for _ in range(4):
        square1.forward(100)
        square1.right(90)
    
    # 画第二个正方形, 移动到新位置
    square2 = turtle.Turtle()
    square2.color("red")
    square2.penup() # 抬笔,移动时不画线
    square2.goto(50, 50) # 移动到坐标 (50, 50)
    square2.pendown()  # 落笔,开始画
    for _ in range(4):
        square2.forward(50)
        square2.right(90)
    
    window.exitonclick()
    

利用这些技巧,就能玩出很多花样。
用 Turtle 库画图是不是挺有意思?遇到窗口不显示的问题,记得看看是不是程序跑太快了,或者window.exitonclick()方法的位置和调用写错了。只要稍微调整一下,就能顺利看到你的画作啦!