Глобальная переменная установлена ​​и затем сброшена в Python Canvas - PullRequest
0 голосов
/ 10 апреля 2020

Добрый день,

Я строю (предположим, что) относительно простой вопрос и эксперимент для психологического эксперимента. Я использую холст Pythons для рисования и рисования, но мне кажется, что я наткнулся на кирпичную стену и классический сценарий обновления c. Вот код:

# Replace with 60000 for 1 minute a question
screen_timeout = 10000
start_time     = clock.time()

# Create a canvas, mouse & keyboard object
canvas         = canvas()
mouse          = mouse()
kb             = keyboard(timeout=0)
question       = '1) Which two chemicals are discussed?'
answer         = ''
show_circle    = False

global circle_clicked
circle_clicked = False

def draw_question_and_answer(c, a):
    c.text('%s<br />(Just start typing; press enter to submit)<br /><br />%s' % (question, a))

def draw_mouse(c, (x, y)):
    c.fixdot(x, y)

def draw_circle(c):
    c['circle'] = Circle(0, 0, 50, fill=True, color='red')

def paint(c, a, s, (x, y)):
    c.clear()
    # show_circle_every(s, 2500)
    # NOTE Drawing order matters here
    if s:
        draw_question_and_answer(c, a)
        draw_circle(c)
        draw_mouse(c, (x, y))
        if (x, y) in c['circle']:
            circle_clicked = True   
    else: 
        draw_question_and_answer(c, a)
    c.show()

def game_loop(c, m, a, s):

    while True:
        if clock.time() - start_time >= screen_timeout:
            break   

        # if clock.time() - start_time >= 2500 and s == False:
        #   s = True

        response, timestamp_kb = kb.get_key()
        (x, y), timestamp_m    = m.get_pos()

        # TODO Extrapolate to function
        if s == False:
            if response == 'return':
                var.gq1 = a
                log.write_vars()
                break

            if response != None and response != 'right shift' and response != 'left shift':
                if response == 'space':
                    a += ' '
                elif response == 'backspace':
                    a = a[:-1]
                else: 
                    a += response
        paint(c, a, s, (x, y))

        # If the user enters the circle it should disappear
        print circle_clicked
        if clock.time() - start_time >= 2500 and circle_clicked == False:
            s = True

game_loop(canvas, mouse, answer, show_circle)

То, что я пытаюсь сделать здесь, это показывать красный круг каждые 2,5 секунды и удерживать его там до тех пор, пока пользовательская мышь не войдет в границу круга. Вот эти строки:

if clock.time() - start_time >= 2500 and circle_clicked == False:
    s = True

Я устанавливаю переменную s (show) в True, чтобы показать круг, который работает. И в этой строке:

if (x, y) in c['circle']:
    circle_clicked = True

, если пользователь входит в круг, который я задаю, нажмет на true. Но если я распечатаю значения, я вижу, что circle_clicked меняется с True на back False - Как получилось? Получает ли l oop свою собственную версию circle_clicked? Если да, то как?

Что я здесь не так делаю, так как считаю, что это довольно простая проблема? Происхождение просто Javascript фона также усложняет ситуацию, так как я пытаюсь научиться Python делать это.

Спасибо

1 Ответ

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

Измените функцию paint на эту

def paint(c, a, s, (x, y)):
    global circle_clicked
    c.clear()
    # show_circle_every(s, 2500)
    # NOTE Drawing order matters here
    if s:
        draw_question_and_answer(c, a)
        draw_circle(c)
        draw_mouse(c, (x, y))
        if (x, y) in c['circle']:
            circle_clicked = True   
    else: 
        draw_question_and_answer(c, a)
    c.show()
...