Включение и выключение al oop с помощью клавиши ввода Turtle - PullRequest
0 голосов
/ 19 апреля 2020

Еще один супер зеленый вопрос, я в этом уверен:

Я прогрессирую со своей страстью к метроному / секвенсору, и для некоторого фона я знаю, что я буду помещать этот код в Raspberry Пи и отображение информации на каком-то экране, поэтому я написал этот код и импортировал черепаху, чтобы однажды отобразить ее на экране 320 х 240.

У меня есть все oop, которое считает такты и удары и отображает их в окне черепахи размером 320 x 240.

Я хочу иметь возможность нажать стрелку вправо на клавиатуре, чтобы начать метроном и стрелка влево на моей клавиатуре, чтобы остановить его.

Я пробовал разные версии onkey (), onkeyrelease () и onkeypress (), но не знаю, как прервать l oop, чтобы остановить его или заставить его ждать команды для его запуска.

код ниже:

import os
import time
import turtle
from turtle import *

win = turtle.Screen()
win.title("Beats & Measures")
win.bgcolor("black")
win.setup(width=240, height=320)
win.tracer(0)

pen1 = turtle.Turtle()
pen1.speed(0)
pen1.color("white")
pen1.penup()
pen1.hideturtle()
pen1.goto(150,-120)

pen2 = turtle.Turtle()
pen2.speed(0)
pen2.color("white")
pen2.penup()
pen2.hideturtle()
pen2.goto(160,-70)

pen3 = turtle.Turtle()
pen3.speed(0)
pen3.color("white")
pen3.penup()
pen3.hideturtle()
pen3.goto(-160,-70)

pen4 = turtle.Turtle()
pen4.speed(0)
pen4.color("white")
pen4.penup()
pen4.hideturtle()
pen4.goto(-160,-140)

three4 = range(1,4)
four4 = range(1,5)
six8 = range(1,7)
eighth = range(1,9)
twelfth = range(1,13)
sixteenth = range(1,17)
thirty2nd = range(1,33)

signatures = [three4,four4,six8,eighth,twelfth,sixteenth,thirty2nd]

beat = signatures[1]



pen3.write("Time Signature", align="left", font=('Digital-7 Mono', 18, 'bold'))
# pen4.write("Choose Time Signature: ", align="left", font=('Digital-7 Mono', 14, 'bold'))


def beatsMeasures():
    measure = 1
    while True:
        for i in beat:
            time.sleep(.5)
            pen2.write("measure : beat",align="right", font=('Digital-7 Mono', 18, 'bold'))
            pen1.clear()
            pen1.write("{}:{}".format(measure, i), align="right", font=('Digital-7 Mono', 48, 'normal'))
        measure = measure + 1


beatsMeasures()

1 Ответ

0 голосов
/ 19 апреля 2020

Скорее всего, вам не удастся внедрить while True: и time.sleep() в среду, управляемую событиями, например, в черепаху. Давайте разберем вашу программу и перестроим ее, используя события таймера черепахи:

from turtle import Screen, Turtle
from itertools import cycle, count

def nextBeat(beat, measure):
    pen1.clear()
    pen1.write("{}:{}".format(measure, beat), align='right', font=('Arial', 48, 'normal'))

    beat = next(beats)

    if beat == 1:
        if not pause:
            screen.ontimer(nextMeasure, 500)
    else:
        screen.ontimer(lambda: nextBeat(beat, measure), 500)

def nextMeasure():
    measure = next(measures)

    pen2.write("measure : beat", align='right', font=('Arial', 18, 'bold'))

    nextBeat(1, measure)

pause = False

def start():
    global pause

    pause = False

    nextMeasure()

def stop():
    global pause

    pause = True

screen = Screen()
screen.title("Beats & Measures")
screen.bgcolor('black')
screen.setup(width=400, height=300)
screen.tracer(0)

pen1 = Turtle()
pen1.hideturtle()
pen1.color('white')
pen1.penup()
pen1.goto(150, -120)

pen2 = pen1.clone()
pen2.goto(160, -70)

pen3 = pen2.clone()
pen3.goto(-160, -70)

three4 = range(1, 4)
four4 = range(1, 5)
six8 = range(1, 7)
eighth = range(1, 9)
twelfth = range(1, 13)
sixteenth = range(1, 17)
thirty2nd = range(1, 33)

signatures = [three4, four4, six8, eighth, twelfth, sixteenth, thirty2nd]

beats = cycle(signatures[1])

measures = count(1)

pen3.write("Time Signature", align='left', font=('Arial', 18, 'bold'))

screen.onkey(start, 'Right')
screen.onkey(stop, 'Left')
screen.listen()

nextMeasure()

screen.mainloop()

Нажатие клавиши со стрелкой влево остановит программу, но в моей простой реализации она продолжит биться до конца такта, тогда остановись Нажатие клавиши со стрелкой вправо возобновится в начале следующего такта. Возможно, не то, что вы хотели, но, надеюсь, отправная точка для того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...