как изменить свойство label вне класса python Tkinter - PullRequest
0 голосов
/ 23 марта 2020

У меня есть проект tkinter, основной скрипт (не полная программа, длинная) выглядит так, метка (led_A) создается внутри класса 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()

Поэтому я пытаюсь реализовать led_A.forget в fun_A, как я могу это сделать? Я попытался global led_A, но основная программа не смогла его распознать. Спасибо

1 Ответ

0 голосов
/ 23 марта 2020

Для управления объектом вам нужна ссылка на объект. В этом конкретном c случае вам нужно сделать led_A атрибутом экземпляра, чтобы вы могли ссылаться на него. Вам также необходимо добавить метод в ваш контроллер, чтобы дать вам доступ к экземпляру Graph.

Чтобы сделать led_A атрибутом экземпляра:

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

Чтобы добавить метод в контроллер, сделайте что-то вроде этого:

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

В идеале, func_A не должен ничего знать о том, как Graph реализован, поскольку func_A не внутри Graph. Это означает, что вам нужно добавить функцию к Graph, которая будет добавлять или удалять светодиод.

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

Наконец, вам нужно изменить fun_A, чтобы использовать этот метод для получения ссылки на график и вызвать функцию:

def fun_A():
    graph = app.get_frame(Graph)
    graph.turn_on_led()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...