2010-10-22 157 views
-1

我写在PythonPython:变量未正确初始化?

self._job = None 

#slider 
def sliderCallback(self): 
    if self._job: 

下面的代码,我得到这个错误信息

AttributeError: 'str' object has no attribute '_job' 

为什么呢?我以为我已经初始化之前变量...

更新 与定时器变量

import Tkinter as tk 
import vtk 
from time import * 
from threading import * 
from vtk.tk import * 
from Visualization import * 
from Histogram import * 
from ListItem import * 

class UI(tk.Frame): 

    def build(self, root): 

     #left column 
     self.leftFrame = tk.Frame(root, width=400, height=550, bg="black") #.grid(column=4, row=0) 
     self.leftFrame.pack(fill=tk.BOTH, expand=True, side=tk.LEFT) 

     #right column 
     self.rightFrame = tk.Frame(root, width=400, height=550, bg="black") #.grid(column=4, row=0) 
     self.rightFrame.pack(fill=tk.BOTH, expand=True, side=tk.RIGHT) 
     #self.rightBottomFrame = tk.Frame(rightFrame, width=400, height=550, bg="red") #.grid(column=4, row=0) 

     #visualization 
     self.vis = Visualization(self.rightFrame, 400, 350, tk.RIGHT) 
     #self.vis.updateContourValue(400) 

     #left column 
     self.middleFrame = tk.Frame(root, width=400, height=550, bg="black") #.grid(column=0, columnspan=4, row=0) 
     self.middleFrame.pack(fill=tk.Y, expand=True) 

     #isosurfaces list 
     def addItem(color, volume, surface):   
      listitem = ListItem(self.listFrame, color, volume, surface) 

     self.listFrame = tk.Frame(self.middleFrame, width=400, height=500, bg="black") #.grid(column=0, columnspan=4, row=0) 
     self.listFrame.pack(fill=tk.BOTH, expand=True, side=tk.TOP) 
     addItem("#243", self.vis.getVolume(), self.vis.getSurface()) 

     #preview 
     self.preview = Visualization(self.middleFrame, 200, 200, tk.BOTTOM) 
     #self.preview.updateContourValue(1500) 

     #histogram 
     self.histFrame = Histogram(self.leftFrame, 400, 400, tk.TOP, self.preview.getData()) 


     #slider 
     def updateValue(self): 
      self.preview.updateContourValue(float(self.slider.get())) 
      print "updated value" 

     self.timer = Timer(5.0, updateValue) 

     def sliderCallback(self): 
      self.timer.cancel() 
      self.timer.start() # after 30 seconds, "hello, world" will be printed 
      #if self._job: 
       #root.after_cancel(self._job) 
       #print "remove it" 
      #self._job = root.after(500, self.updateValue) 

     #def updateValue(value): 
      #print('horizontal: {v}'.format(v=value)) 

     self.slider = tk.Scale(self.leftFrame, from_=0, to=256, orient=tk.HORIZONTAL, command=sliderCallback) #.grid(column=0, columnspan=3, row=1) 
     self.slider.pack(in_=self.leftFrame, fill=tk.X) 
     self.slider.set(200) 

     #add Isosurface button 
     def addIso(): 
      addItem("#243", self.vis.getVolume(), self.vis.getSurface()) 

     self.addButton = tk.Button(self.leftFrame, text="Add", command=addIso) #.grid(column=3, row=1) 
     self.addButton.pack(in_=self.leftFrame, side="right", pady=2) 
+4

你能展示完整的类定义吗? – 2010-10-22 11:04:36

+0

此代码是方法的一部分吗?什么是上下文? – 2010-10-22 11:05:03

+0

@Felix Kling它是一个班级 – aneuryzm 2010-10-22 11:11:00

回答

0

编辑: 随着你新提供的代码,似乎没有在类中定义self._job或_job。

根据您当前的信息,出于某种原因,该函数正在为自己接收一个字符串,而不是您定义的类的一个实例。

0

如果在课堂上正在发生同样的问题:尝试改变self._job = None_job = None - 在该步骤self不声明,我认为

+0

不会,这会引发NameError – knitti 2010-10-22 11:34:48

1

试试这个:


self.slider = tk.Scale(self.leftFrame, from_=0, to=256, orient=tk.HORIZONTAL, command=self.sliderCallback) 

不同的是self,调用sliderCallback已经被绑定到其背景是有用的时候。

0

updateValuesliderCallback必须定义为类的方法。您将它们定义为build方法的本地功能。另外,考虑kitti的答案。