侦听器中未识别变量-Jython Swing

侦听器中未识别变量-Jython Swing,swing,awt,jython,jython-2.7,Swing,Awt,Jython,Jython 2.7,我正在开发一个简单的窗口,在关闭时执行一些操作。这是我的代码摘录: from javax.swing import * from java.awt import * from java.awt.event import * from java.io import * import javax.swing.table.DefaultTableModel as DefaultTableModel class registro(JFrame): def __init__(self):

我正在开发一个简单的窗口,在关闭时执行一些操作。这是我的代码摘录:

from javax.swing import *
from java.awt import *
from java.awt.event import *
from java.io import *
import javax.swing.table.DefaultTableModel as DefaultTableModel

class registro(JFrame):
   def __init__(self):
      super(registro, self).__init__()
      self.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
      self.setExtendedState(JFrame.MAXIMIZED_BOTH)

      #[...]

      headers = ('Data e orario', 
                 'Personale UO Q&A', 
                 'Tipologia di attività'.decode('utf-8'),
                 'Personale incontrato con strutture di appartenenza',
                 'Note')
      self.model = DefaultTableModel([["","","","",""]], headers)
      self.table = JTable(self.model)

      #[...]

      self.addWindowListener(self.onClose())

      #[...]

   def onClose(self):
      class saver(WindowAdapter):
         tableModel = self.model
         def windowClosing(self, event):
            print tableModel #HERE IS THE ERROR!!!!!!!!!
      return saver()
突出显示的行上报告的错误如下:

NameError:未定义全局名称“tableModel”

虽然我已经在侦听器中声明了变量(以避免两个自身之间的误解),但我不明白为什么它从未被识别。我几乎是Jython上面向对象编程和Swing windows的新手,我希望这不是我(非常)严重的缺点


非常感谢。

这里有一个相当微妙的范围问题,主要是关于Python语法,但也涉及您希望访问tableModel的代码。默认情况下,tableModel变量不可见,因为您在onClose()函数中。对此的防御解决方案是显式地将所需的变量传递到新的saver对象中。我个人更喜欢这样,因为它更明确地声明了saver对象的输入

class WindowAdapter:
    None

class App:
    def __init__(self):
        self.model = 'DUMMYMODEL'

    def onClose(self):
        class Saver(WindowAdapter):
            def __init__(self,tableModel):
                WindowAdapter.__init__(self)
                self.tableModel = tableModel

            def windowClosing(self,event):
                print (self.tableModel)
        return Saver(self.model)


if __name__ == '__main__':
    app = App()
    sv = app.onClose()
    sv.windowClosing(event=None)
(这段代码在纯Python中进行了精简,以表明它在很大程度上与作用域相关。)

另一种方法是使用pythonglobal关键字将tableModel变量公开给所有较低的作用域

class WindowAdapter:
    None

class App:
    def __init__(self):
        self.model = 'DUMMYMODEL'

    def onClose(self):
        global tableModel
        tableModel = self.model

        class Saver(WindowAdapter):
            def windowClosing(self,event):
                print (tableModel)
        return Saver()


if __name__ == '__main__':
    app = App()
    sv = app.onClose()
    sv.windowClosing(event=None)

你从这个伟大的小例子中学到了很多,谢谢你!