【问题标题】:Variable not recognized in the listener - Jython Swing侦听器中无法识别的变量 - Jython Swing
【发布时间】:2019-03-11 10:20:34
【问题描述】:

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

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”

虽然我已经在监听器内部声明了变量(避免两个self之间的误解),但我不明白为什么它从来没有被识别。我几乎是 Jython 上面向对象编程和 Swing 窗口的新手,我希望这不是我的(非常)严重的缺点!

非常感谢。

【问题讨论】:

    标签: swing awt jython jython-2.7


    【解决方案1】:

    这里有一个相当微妙的范围问题,主要与 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)
    

    【讨论】:

    • 你从这个很棒的小例子中教会了我很多东西,谢谢!
    猜你喜欢
    • 2014-09-04
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多