全局变量在 Python Canvas 中设置然后重置

Posted

技术标签:

【中文标题】全局变量在 Python Canvas 中设置然后重置【英文标题】:Global variable set and then reset in Python Canvas 【发布时间】:2020-04-10 12:45:40 【问题描述】:

下午好,

我正在为心理学实验构建(假设是)一个相对简单的问答实验。我正在使用 Pythons 画布进行绘图和绘画,但我认为遇到了一些难题和经典的更新场景。代码如下:

# 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

如果用户进入我设置的圆圈,点击为真。但是,如果我打印这些值,我可以看到 circle_clicked 从 True 变为 False - 为什么?循环是否有自己的 circle_clicked 版本?如果有怎么办?

我在这里做错了什么,因为我认为这是一个非常简单的问题?来自纯粹的 javascript 背景也会使事情变得复杂,因为我正在尝试学习 Python 来做这件事。

谢谢

【问题讨论】:

【参考方案1】:

把你的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()

【讨论】:

感谢您的回复 - 您能解释一下您的理由吗?另外-我想保持其他所有内容不变,因为仅将绘画功能更改为您添加的内容是行不通的 所以我让它工作了——所以看来我需要在函数中使用的任何全局变量上显式地对全局变量进行分类,以维护正确的引用然后看起来 是的,您找到了正确的方法,与我在灵魂中提到的方法相同

以上是关于全局变量在 Python Canvas 中设置然后重置的主要内容,如果未能解决你的问题,请参考以下文章

如何在python的reportlab Canvas中设置任何字体?

如何在 Laravel 中设置全局变量?

在R中的引用类中设置全局变量

37如何在函数中设置一个全局变量 ?

在 Xcode 构建阶段运行脚本中设置全局环境变量

从 Node.js 中设置全局环境变量