Tkinter: получить переменную из одного кадра, чтобы показать как метку в другом кадре - PullRequest
0 голосов
/ 08 мая 2018

Ссылка сделана на Как получить переменные данные из класса

Для удобства код из вышеупомянутого поста повторен внизу в сводной форме.

Этот код передает переменную, введенную в Frame PageOne, в PageTwo, и при нажатии кнопки переменная выводится на консоль.

Безуспешно, я пытался установить метку PageTwo, чтобы показать переменную, введенную в PageOne. Сначала я надеялся, что модификация кода будет такой простой, как:

class PageTwo(ttk.Frame):
    def __init__(self, parent, controller):
        self.controller=controller  
        ttk.Frame.__init__(self, parent)
        ttk.Label(self, text='PageTwo').grid(padx=(20,20), pady=(20,20))
        ...

изменив последнюю строку на:

        ttk.Label(self, text=self.controller.app_data["name"].get()).grid(padx=(20,20), pady=(20,20))

Я пробовал разные комбинации, используя идеи из разных постов, но, похоже, мне не хватает фундаментальных рассуждений. Любая помощь будет очень признательна этому новичку.

Полный код, объединенный из указанного выше поста:

#!/usr/bin/python

from Tkinter import *
import ttk

class MyApp(Tk):

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

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


class PageOne(ttk.Frame):
    def __init__(self, parent, controller):
    self.controller=controller
        ttk.Frame.__init__(self, parent)
        ttk.Label(self, text='PageOne').grid(padx=(20,20), pady=(20,20))
        self.make_widget(controller)

    def make_widget(self, controller):
        #self.some_input = StringVar
        self.some_entry = ttk.Entry(self, textvariable=self.controller.app_data["name"], width=8) 
        self.some_entry.grid()
        button1 = ttk.Button(self, text='Next Page',
                                  command=lambda: controller.show_frame(PageTwo))
        button1.grid()

class PageTwo(ttk.Frame):
    def __init__(self, parent, controller):
    self.controller=controller  
        ttk.Frame.__init__(self, parent)
        ttk.Label(self, text='PageTwo').grid(padx=(20,20), pady=(20,20))

    button1 = ttk.Button(self, text='Previous Page',
                             command=lambda: controller.show_frame(PageOne))
        button1.grid()
        button2 = ttk.Button(self, text='press to print', command=self.print_it)
        button2.grid()

    def print_it(self):
    value = self.controller.app_data["name"].get()
        print "The value stored in StartPage some_entry = ",value


app = MyApp()
app.title('Multi-Page Test App')
app.mainloop()

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Как уже упоминалось в figbeam, когда вы переключаете фрейм, он уже создан.Я сделал правку, чтобы обновить метку при нажатии кнопки.

class PageTwo(ttk.Frame):
        def __init__(self, parent, controller):
            self.controller=controller  
            ttk.Frame.__init__(self, parent)
            self.label = ttk.Label(self, text='PageOne')
            self.label.grid(padx=(20,20), pady=(20,20))
            button1 = ttk.Button(self, text='Previous Page',
                                 command=lambda: controller.show_frame(PageOne))
            button1.grid()
            button2 = ttk.Button(self, text='press to print', command=self.print_it)
            button2.grid()

        def print_it(self):
            value = self.controller.app_data["name"].get()
            print ("The value stored in StartPage some_entry = %s", value)
            self.label['text'] = value

В качестве альтернативы, вы можете использовать ту же строковую переменную для вашей метки на второй странице:

ttk.Label(self, textvariable=self.controller.app_data["name"]).grid(padx=(20,20), pady=(20,20))
0 голосов
/ 08 мая 2018

Вы создаете метку для второй страницы из MyApp.__init__(), которая вызывает PageTwo.__init__(), прежде чем что-либо вводится в запись на первой странице.

Вам нужно будет обновить метку при переключении кадров.

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