Экземпляр Python StartPage не имеет атрибута 's' - PullRequest
0 голосов
/ 25 марта 2019

Я получаю:

print (ps) AttributeError: экземпляр StartPage не имеет атрибута 's'

вот мой код:

import Tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.s = []
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        container = tk.Frame(self)
        container.grid(row=0, column=0, sticky='we')
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (StartPage, images_result):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            frame.grid(row=0, column=0, sticky='nsew')
            self.frames[page_name] = frame
        self.show_frame("StartPage")
    def get_SP(self):
        return self.frames["StartPage"]
    def images(self, page_name):
        self.s = [1, 2]
        frame = self.frames[page_name]
        frame.tkraise()
    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.grid(row=0, column=0, sticky='snew')
        frame.tkraise()

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.image_btn = tk.Button(self, text="Images", command=lambda: controller.images("images_result"))
        self.image_btn.grid(row=0, column=0, sticky='snew')



class images_result(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        p = self.controller.get_SP()
        print (p.s)



app = SampleApp()
app.mainloop()

Отредактировано:

Я хочу, чтобы функция images в SampleApp обновляла атрибуты SampleApp, затем я хочу иметь доступ к нему из класса images_results.

Я пытался использовать

print(self.controller.s)

, но это дает мне [], и тем самым кажется, что изменение, которое было выполнено функцией images для атрибута s, невидимо для images_result.

1 Ответ

0 голосов
/ 25 марта 2019

Единственный класс в вашем коде, который в качестве атрибута s является SampleApp. Экземпляр этого класса передается как атрибут controller для каждой страницы. Таким образом, получить доступ к атрибуту s объекта SampleApp изнутри страницы можно через контроллер:

print(self.controller.s)

Важно отметить, что в опубликованном вами коде __init__ метод images_remote будет запускаться только при первом запуске приложения, поэтому любые значения, заданные при взаимодействии с другими страницами, не будут напечатаны __init__ функция.

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