Jest to sekcja z mojego kodu. Zasadniczo chcę uzyskać dostęp do wartości podanej w polu wejściowym, który jest częścią def init . Jest również ustawiony w ten sposób, aby ta zmienna mogła być użyta w całym moim programie. Dzięki.

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()
0
monto 22 luty 2019, 01:01

2 odpowiedzi

Najlepsza odpowiedź

Nie, nie ma możliwości funkcji zewnętrznej, aby uzyskać dostęp do zmiennych lokalnych zdefiniowanych w funkcji.

Jest kilka sposobów, aby rozwiązać problem bez tego. Możesz dokonać zmiennych zdefiniowanych w zmiennych instancji __init__ (atrybuty self) i upewnij się, że funkcja zewnętrzna może uzyskać dostęp do właściwej instancji (być może w zmiennej globalnej).

Lub możesz zdefiniować funkcję w funkcji __init__. Takie zamknięcie może uzyskać dostęp do zmiennych zdefiniowanych w zewnętrznej przestrzeni nazw bez problemu. W konkretnej instancji można nawet dokonać zamknięcia naprawdę małego, przy użyciu lambda, aby zadzwonić do "prawdziwej" funkcji zewnętrznej z argumentem:

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()

Wyrażenie lambda: MyApp.test(test_entry) definiuje nienazwaną funkcję, która utrzymuje przytrzymanie test_entry zdefiniowanej w obszarach metody {x2}}. Po wywołaniu funkcji LAMBDA przechodzi, że wartość w funkcji test. Można również przesunąć całą definicję test w metodzie __init__, a więc zadzwoń bezpośrednio, bez lambda, ale często jest brzydki, ponieważ wiąże się z dużą ilością głębokiego wcięcia.

2
Blckknght 21 luty 2019, 22:37

Nie jestem pewien, czy rozumiem cię poprawnie TBH

Zamiast tego uważałeś za użycie tego?
self.__test_entry = tk.Entry(self)

0
David P. 21 luty 2019, 22:12