19-1 使用 w、s、a、d 操控畫布上的箭頭畫畫(如下)

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3f4bffcc-1b08-45a3-86d8-484c95316227/1616946560524.gif

程式碼實現 Method 1:

from turtle import Turtle, Screen

tim = Turtle()
screen = Screen()

def move_forward():
    tim.forward(10)

def move_backward():
    tim.backward(10)

def turn_left():
    tim.left(10)

def turn_right():
    tim.right(10)

def reset_screen():
    # teacher method:
    tim.clear()
    tim.penup()
    tim.home()
    tim.pendown()
    
    # 亦可使用此函數,只是使用這個會全部恢復預設(ex:箭頭顏色是黑的)
    # tim.reset()

# screen.onkey(key='w', fun=move_forward)
# screen.onkey(key='s', fun=move_backward)
# screen.onkey(key='a', fun=turn_left)
# screen.onkey(key='d', fun=turn_right)
# screen.onkey(key='z', fun=reset_screen)

# 與上面的五行結果一致
_dict = {
    "w": move_forward,
    "s": move_backward,
    "a": turn_left,
    "d": turn_right,
    "z": reset_screen
}

for key, value in _dict.items():
    screen.onkey(key=key, fun=value)

screen.listen()
screen.exitonclick()

程式碼實現 Method 2:

from turtle import Screen, Turtle

class Draw:

    def __init__(self, color):
        # 若要設為private variable,在原先變數名稱加上兩條_
        # 例如: self.__turtle = Turtle()
        self.turtle = Turtle()
        self.screen = Screen()
        self.turtle.color(color)
        self.color = color

    # 若要設為private method(before method name add __)
    def move_forward(self):
        self.turtle.forward(10)

    def move_backward(self):
        self.turtle.backward(10)

    def turn_left(self):
        self.turtle.left(10)

    def turn_right(self):
        self.turtle.right(10)

    def reset_screen(self):
        # 重置後,顏色會一致(因為是將原先的箭頭位置直接移到初始位)
        self.turtle.clear()
        self.turtle.penup()
        self.turtle.home()
        self.turtle.pendown()

        # 使用下面方法雖然也會重製但是箭頭會變成預設黑色與當初自己設定的物件顏色不一致
        # self.turtle.reset()
        # self.turtle.color(self.color)

    def draw_screen(self):

        self.screen.onkeypress(key='w', fun=self.move_forward)
        self.screen.onkeypress(key='s', fun=self.move_backward)
        self.screen.onkey(key='a', fun=self.turn_left)
        self.screen.onkey(key='d', fun=self.turn_right)
        self.screen.onkey(key='z', fun=self.reset_screen)
        self.screen.listen()
        self.screen.exitonclick()
from method2 import Draw

draw = Draw(color="blue")
draw.draw_screen()

※ 補充: 若是將主程式改成(如下面程式範例),關掉第一個物件的視窗再創建第二個物件時,程式會報錯。

from method2 import Draw

draw = Draw(color="blue")
draw.draw_screen()
draw1 = Draw(color="green")
draw1.draw_screen()

# 可將上面方法改成如下
colors = ['blue', 'green', 'red']
for color in colors:
    draw = Draw(color=color)
    draw.draw_screen()

錯誤訊息如圖:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7d786e0f-9056-4a26-b09f-3c00d292c6ac/Untitled.png

解決方法(如下面程式範例 in method2.py):

def __init__(self, color):
        try:
            self.turtle = Turtle()
            self.screen = Screen()
            self.turtle.color(color)
            self.color = color
        except:
            self.turtle = Turtle()
            self.screen = Screen()
            self.color = color
            self.turtle.color(color)

turtle窗口显示、隐藏与turtle.Terminator深层探究_★·°立芯;︶︵︶-CSDN博客


19-2 賽龜(使用者猜測獲勝烏龜顏色,比賽哪隻烏龜能獲勝。如下)

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/fcce344f-c0b2-4b40-9a9e-d6c5b0da1b9d/1617203828533.gif