Как установить пользовательский ввод в качестве текста по умолчанию для виджета Tkinter Entry в другом фрейме? - PullRequest
0 голосов
/ 07 января 2020

У меня есть два кадра для переключения. В каждом кадре есть поле Entry. Как установить ввод в первом поле Entry в первом кадре в качестве текста по умолчанию для второго поля Entry во втором кадре?

from tkinter import *


class Root(Tk):

    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (PageOne, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("PageOne")

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

    def quit(self):
        self.destroy()

text = ''


class PageOne(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

        global text

        entry_box_1 = Entry(self, width=40)
        entry_box_1.pack()
        text = entry_box_1.get()

        quit_button = Button(self, text="Quit Program",
                    command=lambda: controller.quit())
        next_button = Button(self, text="Next",
                    command=lambda: controller.show_frame('PageTwo'))

        next_button.pack()
        quit_button.pack()


class PageTwo(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

        entry_box_2 = Entry(self, width=40)
        entry_box_2.insert(END, text)
        entry_box_2.pack()

        quit_button = Button(self, text="Quit Program",
                            command=lambda: controller.quit())
        back_button = Button(self, text="Back",
                            command=lambda: controller.show_frame("PageOne"))

        back_button.pack()
        quit_button.pack()

if __name__ == "__main__":
    root = Root()
    root.mainloop()

Мой второй Entry ящик остается пустым, когда я переключаюсь на второй кадр.

1 Ответ

0 голосов
/ 08 января 2020

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

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

from tkinter import *


class Root(Tk):

    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        container = Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (PageOne, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("PageOne")

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

    def show_frame_with_default_text(self, page_name, text):
        frame = self.frames[page_name]
        frame.entry_box.delete(0, END)
        frame.entry_box.insert(0, text)
        frame.tkraise()

    def quit(self):
        self.destroy()


class PageOne(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

        entry_box_1 = Entry(self, width=40)
        entry_box_1.pack()

        quit_button = Button(self, text="Quit Program",
                    command=lambda: controller.quit())
        next_button = Button(self, text="Next",
                    command=lambda: controller.show_frame_with_default_text('PageTwo', entry_box_1.get()))

        next_button.pack()
        quit_button.pack()


class PageTwo(Frame):

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.controller = controller

        self.entry_box = Entry(self, width=40)
        self.entry_box.pack()

        quit_button = Button(self, text="Quit Program",
                            command=lambda: controller.quit())
        back_button = Button(self, text="Back",
                            command=lambda: controller.show_frame("PageOne"))

        back_button.pack()
        quit_button.pack()


if __name__ == "__main__":
    root = Root()
    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...