Есть ли способ ждать, пока условие будет выполнено? - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь зарегистрировать координаты 3 раза, когда пользователь нажимает на экран черепахи, затем продолжаю выполнять другие команды, как только это будет выполнено. Нажатие 3 раза ничего не дает, и оболочка продолжает печатать, что ждет, в то время как один дополнительный щелчок заставляет все это не работать, и я получаю сообщение «Не отвечает» из графического окна черепахи.

import turtle as t
import time
canvas=t.getcanvas()
xlist=[]
ylist=[]
listcomplete=False

def getPos(x,y):
    xlist.append(canvas.winfo_pointerx())  ##Logs the x and y coords when mouse is clicked
    ylist.append(canvas.winfo_pointery())
    print('appended the lists.')
    if len(xlist)==3:                    
        listcomplete=True

t.onscreenclick(getPos)

def main():
    while listcomplete==False:
        time.sleep(1)
        print('waiting...')     ##Prints periodically just to let me know it's still running


main()

print('list complete.')      ##Prints to alert the list has been finished
print(xlist)
(Insert rest of code to follow)

Ответы [ 3 ]

0 голосов
/ 22 января 2020
def handle_click(mouse_x,mouse_y):  # <== I think thats what ya need right dere, I dont think it knows you're clicking
    newpin = [[mouse_x,mouse_y], [0,0], 0,0,20, 1000000]

Я попытался поместить оператор печати после щелчка, но не смог заставить его даже распечатать тестовый щелчок. Это может быть, я не слишком стараюсь, хотя;) Я просто помню, как использовал что-то подобное выше, чтобы справиться с щелчком мыши. (в моей ситуации он создал пин-код для игры в пинбол), если вы посмотрите на api черепахи для круга, вы можете увидеть [0,0], 0,0,20, 100000].

Но в конечном итоге последнее число 10000, что бы ни было «массой», поэтому чем больше оно, тем меньше оно движется опять моя ситуация. turtle.onscreenclick (handle_click). Это, по крайней мере, идея :) и да, вы можете подождать после if. Добавьте в печать заявления.

0 голосов
/ 22 января 2020

Можно ли продолжать запускать окно черепахи после того, как списки были созданы?

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

from turtle import Screen, Turtle, mainloop

def getPosition(x, y):
    screen.onscreenclick(None)  # disable the handler inside the handler

    positions.append((x, y))

    if len(positions) == 3:
        screen.ontimer(listComplete)  # sometime after this function completes
    else:
        screen.onscreenclick(getPosition)  # restore the handler

def listComplete():
    for position in positions:
        turtle.goto(position)
        turtle.pendown()

    turtle.goto(positions[0])  # close our triangle

    # (Insert rest of code to follow)

positions = []

turtle = Turtle()
turtle.hideturtle()
turtle.penup()

screen = Screen()
screen.onscreenclick(getPosition)
mainloop()  # invoke as function to make Python 2 friendly as well

Ключ в том, что «остальной код, который будет следовать» будет в функции, а не код верхнего уровня.

0 голосов
/ 22 января 2020

listcomplete=True в getPos() не изменит глобальную переменную, вместо этого он создаст новую переменную с тем же именем в локальной области видимости.

Чтобы изменить глобальную переменную, вы должны указать python чтобы использовать его из глобальной области видимости:

def getPos(x,y):
    global listcomplete # tell python to use the variable from the global scope
    xlist.append(canvas.winfo_pointerx())  ##Logs the x and y coords when mouse is clicked
    ylist.append(canvas.winfo_pointery())
    print('appended the lists.')
    if len(xlist)==3:                    
        listcomplete=True

Это связано с поведением по умолчанию оператора присваивания (=).

Другие операторы, такие как оператор сравнения ( ==) будет искать переменную из окружающих областей, если она не найдена в локальной области, поэтому вы можете использовать while listcomplete==False: в main() без указания Pyton использовать переменную из глобальной области.


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

import turtle as t
canvas=t.getcanvas()
xlist=[]
ylist=[]

def getPos(x,y):
    xlist.append(canvas.winfo_pointerx())  ##Logs the x and y coords when mouse is clicked
    ylist.append(canvas.winfo_pointery())
    print('appended the lists.')
    if len(xlist)==3:
        t.bye() # exit turtle window

t.onscreenclick(getPos)
t.Screen().mainloop() # will wait until turtle window is closed

print('list complete.')      ##Prints to alert the list has been finished
print(xlist)
...