听众无法识别变量 - Jython Swing

问题描述 投票:0回答:1

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

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窗口的新手,我希望这不是我(非常)严重的缺点! 提前谢谢了。

swing awt jython jython-2.7
1个回答
1
投票

这里有一个相当微妙的范围问题,主要是关于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中被删除,以表明它与搜索范围有关。)

另一种方法是使用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)
© www.soinside.com 2019 - 2024. All rights reserved.