Нет, внешняя функция не может получить доступ к локальным переменным, определенным в функции.
Однако есть несколько способов решить вашу проблему без этого.Вы можете создать переменные, определенные в __init__
переменных экземпляра (атрибуты self
), и убедиться, что ваша внешняя функция может обращаться к нужному экземпляру (возможно, в глобальной переменной).
Или вы можете определить функциювнутри функции __init__
.Такое замыкание может обращаться к переменным, определенным во внешнем пространстве имен, без проблем.В вашем конкретном случае вы могли бы даже сделать замыкание очень маленьким, используя lambda
для вызова «реальной» внешней функции с аргументом:
class MainApp(tk.Tk):
def test(test_entry):
a = test_entry.get()
print(a)
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
test_entry = tk.Entry(self)
test_entry.pack()
submit_button = tk.Button(self, text="Submit", command=lambda: MyApp.test(test_entry))
submit_button.pack()
Выражение lambda: MyApp.test(test_entry)
определяет неназванную функциюкоторый сохраняет test_entry
, определенный в пространстве имен метода __init__
.Когда вызывается лямбда-функция, она передает это значение в функцию test
.Вы также можете переместить все определение test
в метод __init__
и вызывать его напрямую, без lambda
, но это часто уродливо, поскольку требует много глубоких отступов.