Python tkinter передает переменные между классами или фреймами - PullRequest
0 голосов
/ 29 ноября 2018

Я новая разработка ООП и пользовательского интерфейса с использованием tkinter.В настоящее время у меня есть следующий код:

class Snapshot_app(Tk):
    def __init__(self):
        Tk.__init__(self)
        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)
        self.frames = {}
        for F in (StartPage, PageOne,PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky=NSEW)

        self.show_frame(StartPage)

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

Class PageOne(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)

        Label(self, text="Path to files").grid(row=1,column=0)

        self.fname = Entry(self)
        self.fname.grid(row=1, column=1)
        app.frames[PageTwo].dummy = self.fname.get()
        b = Button(self,text="Open Page 2",command=lambda:app.show_frame(PageTwo)).grid(row=2,column=1)

Class PageTwo(Frame):
    def __init__(self, parent, controller,dummy=None):
        Frame.__init__(self, parent)
        self.data = dummy     
        print(self.data)

app = Snapshot_app()
app.title("Snapshot Tool")
app.geometry("1200x400")
app.mainloop()

В классе PageTwo выдается сообщение об ошибке self.data = None.Это означает, что я не могу передать фиктивную информацию из PageOne в PageTwo.Однако, если я помещу кнопку в PageTwo, событие которой запускает печать self.data, я смогу успешно получить данные из PageOne.Я хотел бы, однако, действительно избегать использования кнопки.Любые указатели и помощь будут высоко ценится!

1 Ответ

0 голосов
/ 29 ноября 2018

Проблема заключается в создании экземпляра PageTwo.Ваш экземпляр Snapshot_app().Цикл запускается и создает экземпляр StartPage, за которым следует PageOne.В этот момент вызывается PageOne.__init__, который устанавливает

app.frames[PageTwo].dummy = self.fname.get()

По моему мнению, это даже не должно работать, поскольку PageTwo еще не был добавлен в app.frames, так какцикл до в позиции PageOne.Если это так, вы должны получить KeyError: PageTwo.Если это не так (я не знаю, разделяли ли вы весь код) и если вы уже создали его где-то еще, он бы существовал, но после создания PageOne цикл for продолжится с PageTwo переопределяет всю существующую запись app.frames[PageTwo] и создает ее экземпляр без фиктивного аргумента, в результате чего self.data = dummy становится None.

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