Mam projekt TKININS, główny skrypt (nie pełny program, do długiego), wygląda tak, etykieta (LED_A) jest tworzona w klasie TK,

 ....
 def fun_A:
      ...
      #need to hidden led_A 
      #**need to implement** led_A.forget() or .place()
 class home(tk.Tk)
    def __init__(self, *args, **kwargs)        
        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.wm_title(self, "Graph ")       
        self.geometry("1000x800")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        F=Graph
        frame=Graph(container, self)
        self.frames[F] = frame
        frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(Graph)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

 class Graph(tk.frame):
       def __init__(self,parent,controller):
          ...
          photo = PhotoImage(file='1.jpg')
          led_A = label(self, image = photo)

 app = home()
 app.mainloop()

Więc próbuję wdrożyć LED_A.Forget w fun_a, jak mogłem zrobić? Próbowałem global led_A, ale główny program nie mógł go rozpoznać. Dzięki

-1
adam wu 23 marzec 2020, 02:06

1 odpowiedź

Najlepsza odpowiedź

Aby manipulować obiektem, potrzebujesz odniesienia do obiektu. W tym konkretnym przypadku musisz wykonać atrybut instancji led_A, dzięki czemu możesz go odwołać. Musisz także dodać metodę w kontrolerze, aby zapewnić dostęp do instancji Graph.

Aby zrobić led_A atrybut instancji:

class Graph(tk.frame):
    def __init__(self,parent,controller):
        ...
        photo = PhotoImage(file='1.jpg')
        self.led_A = label(self, image = photo)
        ...

Aby dodać metodę do sterownika, zrób coś w ten sposób:

class home(tk.Tk)
    ...
    def get_frame(self, frame_class):
        return self.frames[frame_class]

Idealnie, func_A nie powinien wiedzieć nic o tym, jak Graph jest zaimplementowany od func_A nie jest wewnątrz Graph. Oznacza to, że musisz dodać funkcję do Graph, która doda lub wyjmie LED.

class Graph(tk.frame):
    ...
    def turn_on_led(self):
        self.led_A.grid(...)

Wreszcie musisz zmodyfikować fun_A, aby użyć tej metody, aby uzyskać odniesienie do wykresu i wywołania funkcji:

def fun_A():
    graph = app.get_frame(Graph)
    graph.turn_on_led()
0
Bryan Oakley 22 marzec 2020, 23:34