Использование переменной из _init_ - PullRequest
0 голосов
/ 22 февраля 2019

Это раздел из моего кода.По сути, я хочу получить доступ к значению, указанному в поле ввода, которое является частью def init ... Есть ли способ обойти это без использования глобальных переменных?Кроме того, он настроен таким образом, чтобы эту переменную можно было использовать во всей моей программе.Спасибо.

import tkinter as tk

class MainApp(tk.Tk):

def test():
    a = __init__.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=MyApp.test)
    submit_button.pack()

if __name__ == "__main__":
    app = MainApp()
    app.mainloop()

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Нет, внешняя функция не может получить доступ к локальным переменным, определенным в функции.

Однако есть несколько способов решить вашу проблему без этого.Вы можете создать переменные, определенные в __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, но это часто уродливо, поскольку требует много глубоких отступов.

0 голосов
/ 22 февраля 2019

Я не уверен, правильно ли я вас понял. Tbh

Рассматривали ли вы использовать это вместо?
self.__test_entry = tk.Entry(self)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...