【问题标题】:Start and stop Python turtle with space bar (wall design)用空格键启动和停止 Python 乌龟(墙壁设计)
【发布时间】:2022-01-16 22:00:39
【问题描述】:

程序绘制墙的布局。根据我的想法,它应该绘制墙壁的边界,移动到中心,只有在按下空格键时才用图纸填充墙壁,创建一个设计。按下空格键时它也应该停止。问题是使用我的代码,它执行所有任务,除了停止。你有什么想法?图片显示了结果。result该程序适用于包含调色板的文件。

from turtle import *
from turtle import Screen
from random import randint
import random

seinalaius=float(input("Sisestage seina laius (500-1500): "))
seinapikkus=float(input("Sisestage seina pikkus (500-900): "))
värvipalett=input("Mis värvipaletti tahaksite kasutada? (Valik: mustvalge, roosa, punane, lilla, sinine, kollane, roheline, beež, oranž): ")
screen = Screen()
fail = open(värvipalett + '.txt', encoding='UTF-8')
värvid = []
for rida in fail:
    rida = rida.strip()
    värvid.append(rida)

up()
goto(-seinalaius / 2, -seinapikkus / 2)
down()

for i in range(2):
    forward(seinalaius)
    left(90)
    forward(seinapikkus)
    left(90)

up()
goto(0, 0)
down()

def current_state():
        global moving
        moving = False
        penup()

def next_state():
    global moving
    pendown()
    moving = True
    move()

def space_bar():
    global current_state, next_state
    next_state()
    current_state, next_state = next_state, current_state

def move():
    if moving:
        while True:
            pöörded = randint(4, 8)
            begin_fill()
            color(random.choice(värvid))
            for i in range(pöörded):
                pikkus = randint(0, 150)

                up()
                forward(pikkus)
                if not -seinalaius / 2 <= xcor() <= seinalaius / 2 or not -seinapikkus / 2 <= ycor() <= seinapikkus / 2:
                    backward(pikkus)
                backward(pikkus)
                down()

                forward(pikkus)
                lr = randint(1, 2)
                if lr == 1:
                    left(90)
                else:
                    right(90)
            speed("fastest")
            end_fill()
            up()
            down()

current_state()

screen.onkey(space_bar, "space")

screen.listen()

screen.mainloop()

文件('sinine.txt')内容:

aliceblue
aquamarine
aquamarine1
aquamarine2
aquamarine3
aquamarine4
blue
blue1
blue2
blue3
blue4
CadetBlue
CadetBlue1
CadetBlue2
CadetBlue3
CadetBlue4
CornflowerBlue
cyan
cyan1
cyan2
cyan3
cyan4
DarkBlue
DarkCyan
DarkSlateBlue
DarkSlateGray
DarkSlateGray
DarkSlateGray2
DarkSlateGray3
DarkSlateGray4
DarkSlateGrey
DarkTurquoise
DeepSkyBlue
DeepSkyBlue2
DeepSkyBlue3
DeepSkyBlue4
DodgerBlue
DodgerBlue1
DodgerBlue2
DodgerBlue3
DodgerBlue4
LightBlue
LightBlue1
LightBlue2
LightBlue3
LightBlue4
LightSeaGreen
LightSkyBlue
LightSkyBlue1
LightSkyBlue2
LightSkyBlue3
LightSkyBlue4
LightSlateGray
LightSlateGrey
LightSteelBlue
LightSteelBlue1
LightSteelBlue2
LightSteelBlue3
LightSteelBlue4
MediumAquamarine
MediumBlue
MediumSlateBlue
MediumTurquoise
midnightblue
MidnightBlue
navy
NavyBlue
PaleTurquoise
PaleTurquoise1
PaleTurquoise2
PaleTurquoise3
PaleTurquoise4
PaleVioletRed
PowderBlue
RoyalBlue
RoyalBlue1
RoyalBlue2
RoyalBlue3
RoyalBlue4
SkyBlue
SkyBlue1
SkyBlue2
SkyBlue3
SkyBlue4
SlateGray
SlateGray1
SlateGray2
SlateGray3
SlateGray4
SteelBlue
SteelBlue1
SteelBlue2
SteelBlue3
SteelBlue4
turquoise
turquoise1
turquoise2
turquoise3
turquoise4

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    您的状态机逻辑是一场灾难。首先,current_statenext_state 是函数 变量的名称!不要那样做,一个会覆盖另一个。接下来,您永远不会初始化上述任何一个。 move() 中的内部 While True: 循环使外部 if moving: 测试永远不会停止操作。你的select_next_state() 处理程序直接调用move() 如此有效地永远不会返回。

    我已经修改了下面的代码,以按照您的预期开始和停止。我使用ontimer() 触发move(),以便事件处理程序可以立即返回。我将move() 中的两个循环合并为一个并初始化您的全局状态变量。并清理了其他引起我注意的东西:

    from turtle import Screen, Turtle
    from random import randint, choice
    
    current_state, next_state = False, True
    moving = current_state
    
    def select_current_state():
        global moving
    
        moving = current_state
    
    def select_next_state():
        global moving
    
        moving = next_state
    
        screen.ontimer(move)
    
    def space_bar():
        global current_state, next_state
    
        select_next_state()
    
        current_state, next_state = next_state, current_state
    
    def move():
        while moving:
            pöörded = randint(4, 8)
            turtle.color(choice(värvid))
            turtle.begin_fill()
    
            for _ in range(pöörded):
                pikkus = randint(0, 150)
    
                turtle.penup()
                turtle.forward(pikkus)
                if not -seinalaius / 2 <= turtle.xcor() <= seinalaius / 2 or not -seinapikkus / 2 <= turtle.ycor() <= seinapikkus / 2:
                    turtle.backward(pikkus)
                turtle.backward(pikkus)
                turtle.pendown()
    
                turtle.forward(pikkus)
    
                if choice([True, False]):
                    turtle.left(90)
                else:
                    turtle.right(90)
    
            turtle.end_fill()
    
    seinalaius = float(input("Sisestage seina laius (500-1500): "))
    seinapikkus = float(input("Sisestage seina pikkus (500-900): "))
    
    värvipalett = input("Mis värvipaletti tahaksite kasutada? (Valik: mustvalge, roosa, punane, lilla, sinine, kollane, roheline, beež, oranž): ")
    
    fail = open(värvipalett + '.txt', encoding='UTF-8')
    
    värvid = []
    
    for rida in fail:
        rida = rida.strip()
        värvid.append(rida)
    
    screen = Screen()
    
    turtle = Turtle()
    turtle.speed('fastest')
    
    turtle.penup()
    turtle.goto(-seinalaius / 2, -seinapikkus / 2)
    turtle.pendown()
    
    for _ in range(2):
        turtle.forward(seinalaius)
        turtle.left(90)
        turtle.forward(seinapikkus)
        turtle.left(90)
    
    turtle.penup()
    turtle.home()
    turtle.pendown()
    
    select_current_state()
    
    screen.onkey(space_bar, 'space')
    
    screen.listen()
    
    screen.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多