如何在同一个类中的另一个函数中使用函数的一个对象(Python)

时间:2018-03-08 17:46:53

标签: python

我想在"img"中使用browse_file() grey_scale()。 我可以使用band_count(type Int),但当我尝试在"img"中使用grey_scale()时,我收到以下错误:

the type of "img" is class 'spectral.io.bilfile.BilFile'
Traceback (most recent call last):
File "main.py", line 50, in grey_scale
view = imshow(img,(bandGrey,))`
NameError: global name 'img' is not defined`

我的代码:

def browse_file(self,MainWindow):
    file = str(QtGui.QFileDialog.getOpenFileName(self,"Select Directory"))
    img = envi.open(file)       #load image to img object.
    band_info = str(img.read_band) 
    band_count = int((band_info.split(start))[1].split(end)[0])
    view = imshow(img,(1,0,0))

def grey_scale(self):
    bandGrey = self.spinBox_grey_band.value()
    print bandGrey      #working
    view = imshow(img,(bandGrey,))  #error 

3 个答案:

答案 0 :(得分:2)

看起来你需要让img成为一个实例属性,以便它得到"保存"调用selfbrowse_file之间的grey_scale

def browse_file(self,MainWindow):
    file = str(QtGui.QFileDialog.getOpenFileName(self,"Select Directory"))
    img = envi.open(file)       #load image to img object.
    band_info = str(img.read_band) 
    band_count = int((band_info.split(start))[1].split(end)[0])
    view = imshow(img,(1,0,0))
    self.img = img

def grey_scale(self):
    bandGrey = self.spinBox_grey_band.value()
    print bandGrey      #working
    view = imshow(self.img,(bandGrey,))  #error 

这当然意味着您需要确保在browse_file之前调用grey_scale,以便self.img在使用之前定义。

答案 1 :(得分:1)

局部变量的意义在于它们只存在于函数中,因此您无法按照定义执行此操作。

通常,答案是传递变量的值。例如,browse_file可以将img返回给其调用者,并且该调用者可以将其保留,然后将其传递到grey_scale

另一个选择是使用类来保持状态。这些函数似乎已经是一个类的方法(基于self参数),所以这里有正确的设计。只需用img替换两个函数中的每个self.img,现在这不是局部变量,它就是实例的成员。在同一实例上调用的每个方法都可以访问相同的值。但是,如果您创建同一个类的多个实例,则每个实例都有自己的img

答案 2 :(得分:0)

您需要从函数img

返回browse_file()

然后从函数中创建一个新的vaiable。

接下来将img添加到grey_scale()

中的参数列表中
def browse_file(self,MainWindow):
    file = str(QtGui.QFileDialog.getOpenFileName(self,"Select Directory"))
    img = envi.open(file)       #load image to img object.
    band_info = str(img.read_band) 
    band_count = int((band_info.split(start))[1].split(end)[0])
    view = imshow(img,(1,0,0))
    return img

img = browse_file(self,MainWindow)

def grey_scale(self, img):
    bandGrey = self.spinBox_grey_band.value()
    print bandGrey      #working
    view = imshow(img,(bandGrey,))  #error 

grey_scale(img)

你可以在课堂内重复使用img。

如果您希望使用该类的img变量,您可以将其设为全局

global img
img = browse_file(self,MainWindow)

或从班级创建变量。

img = class_object.browse_file(MainWindow)