【问题标题】:NameError: name 'VAR' is not definedNameError:名称“VAR”未定义
【发布时间】:2016-10-08 21:37:16
【问题描述】:

我这里有一个 Python 脚本,用于计算工作空间的尺寸,然后确定自动化脚本应该在哪里单击或输入数据。

我遇到了一个问题,变量在一个函数中生成,但在另一个函数中无法访问。我通过脚本返回了我想继续使用的变量,但它给了我一个错误,说它尚未定义。

到目前为止,这是我的代码:

import pyautogui
import time
import finder

def areaSetup():
    getWorkSpace('img/dimen/loginDimTop.png' , 'img/dimen/loginDimBot.png')
    getWaHWorkSpace(workSpace)
    getQuad1(workSpace,W, H, Hh, Wh)
    getQuad2(workSpace,W, H, Hh, Wh)
    getQuad3(workSpace,W, H, Hh, Wh)
    getQuad4(workSpace,W, H, Hh, Wh)
    return workSpace, quad1, quad2, quad3, quad4

def getWorkSpace(browTopLeft, browBotRight):
    top = pyautogui.locateOnScreen( browTopLeft , grayscale=True)
    print (top)
    bottom = pyautogui.locateOnScreen( browBotRight , grayscale=True)
    print (bottom)
    x1, y1, h1, w1 = top
    x2, y2, h2, w2 = bottom
    x2 = x2+w2
    y2 = y2+h2
    print ("initial print" , x1, y1, x2, y2)
    workSpace = x1, y1, x2, y2
    print ("Workspace" , workSpace)
    return workSpace

def getWaHWorkSpace(workSpace):
    x1, y1, x2, y2 = workSpace #break it into four parts again
    W = x2 - x1 #get the height
    H = y2 - y1 #get the width
    Hh = 0.5 * H #get mid point of height
    Wh = 0.5 * W #get mid point of width
    print ("W and H" , W, H, Hh, Wh)
    return W, H, Hh, Wh

我的回溯如下:

(14, 40, 42, 47)
(694, 774, 342, 44)
initial print 14 40 738 1116
Workspace (14, 40, 738, 1116)
Traceback (most recent call last):
File "loginPage_001.py", line 35, in <module>
areaDimensions.areaSetup()
File "/home/tvorac/python/testBot/areaDimensions.py", line 7, in areaSetup
getWaHWorkSpace(workSpace)
NameError: name 'workSpace' is not defined

我很确定我忽略了一些简单的事情,并将继续查看 Python 文档,看看我是否能发现我做错了什么。

感谢您抽出宝贵时间!

【问题讨论】:

  • getWorkSpace() 返回一些值,但您没有在areaSetup() 中捕获这些值。也许你想这样做:workspace = getWorkSpace(...)?

标签: python namespaces defined pyautogui


【解决方案1】:

问题在于 Python 与任何其他编程语言一样具有变量范围。
这意味着根据您放置变量的位置,它可能只能在该范围内访问,在这种情况下,您的函数 getWorkSpace() 创建它。

为了让其他人访问它,您必须执行以下两项操作之一。
要么创建一个全局变量,就像这样:

import pyautogui
import time
import finder

workspace = None

def areaSetup():
    global workspace
    ...

def getWorkSpace(browTopLeft, browBotRight):
    global workspace
    ...
    workSpace = x1, y1, x2, y2

def getWaHWorkSpace(workSpace):
    global workspace
    ...

或者直接使用函数的返回值。

workspace = getWorkSpace('img/dimen/loginDimTop.png' , 'img/dimen/loginDimBot.png')

因为getWorkSpace() 确实返回了一个工作空间,正如你所期望的那样,因为你已经完成了return workSpace,问题是你没有将它存储在任何地方。

这是您的两个选项,要么处理返回值,要么按预期使用 getWorkSpace 函数。或者创建一个全局变量

【讨论】:

    【解决方案2】:

    我发现了我的错误!

    当我在函数 areaSetup() 中调用变量时,我没有说明这些变量来自这些函数

    这就是我所做的:

        def areaSetup():
        workSpace = getWorkSpace    ('img/dimen/loginDimTop.png' , 'img/dimen/loginDimBot.png')
        W, H, Hh, Wh = getWaHWorkSpace(workSpace)
        quad1 = getQuad1(workSpace,W, H, Hh, Wh)
        quad2 = getQuad2(workSpace,W, H, Hh, Wh)
        quad3 = getQuad3(workSpace,W, H, Hh, Wh)
        quad4 = getQuad4(workSpace,W, H, Hh, Wh)
        return workSpace, quad1, quad2, quad3, quad4
    

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2021-04-15
      • 2019-01-26
      • 2021-10-05
      • 2017-08-16
      相关资源
      最近更新 更多