Переменная не распознается в слушателе - Jython Swing - PullRequest
0 голосов
/ 11 марта 2019

Я разрабатываю простое окно, которое выполняет некоторые операции при закрытии.Это мой фрагмент кода:

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 ), я не понимаю, почему она никогда не распознавалась.Я почти новичок с объектно-ориентированным программированием и окнами Swing на Jython, и я надеюсь, что это не мой (очень) серьезный недостаток!

Большое спасибо заранее.

1 Ответ

1 голос
/ 15 марта 2019

Здесь есть довольно тонкая проблема области видимости, которая в основном связана с синтаксисом 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 показывает, что он в значительной степени связан с областью видимости.)

Anальтернативой было бы использование глобального ключевого слова 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)
...