侦听器中无法识别变量 - Jython Swing

Variable not recognized in the listener - Jython Swing

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

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: global name 'tableModel' is not defined

虽然我已经在listener内部声明了这个变量(避免两者之间的误会self),但我不明白为什么一直没有识别到​​。我几乎是面向对象编程和Jython 上的Swing windows 的新手,我希望这不是我(非常)严重的缺点!

非常感谢。

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

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 形式显示它主要与范围相关。)

另一种方法是使用 Python 全局关键字将 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)