Как сохранить общие данные в tkinter для python? - PullRequest
0 голосов
/ 12 октября 2019

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

Вот код, который связан сэто: (разрывы страниц как раз там, где есть какой-то несвязанный код)

import tkinter as tk
from tkinter import Tk, Label, Button, StringVar

class Keep(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.shared_data ={
            "email": tk.StringVar(),
            "password": tk.StringVar()
        }
# Skipping some code to get to the good stuff

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        # LABELS, ENTRIES, AND BUTTONS

        # page break

        self.entry1 = tk.Entry(self, textvariable=self.controller.shared_data["email"])
        entry2 = tk.Entry(self, show = '*')
        button1 = tk.Button(text="Submit", command=lambda: [controller.show_frame("PageTwo"), self.retrieve()])

    # page break

    def retrieve(self):
        self.email = self.controller.shared_data["email"].get()
        self.controller.email = self.email

class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.email = self.controller.shared_data["email"].get()

        label1 = tk.Label(self, text="Welcome, {}".format(self.email))

if __name__ == "__main__":
    keep = Keep()
    keep.mainloop()

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

Конечной целью является label1 из pageTwo для отображения «Добро пожаловать, (введите адрес электронной почты, введенный в entry1 из startPage)».

Я думаю, что мойпроблема заключается в pageTwo получении пустой строки из shared_data, но я не понимаю, почему это так.

Любая помощь очень важна!

1 Ответ

0 голосов
/ 12 октября 2019

Полагаю, проблема в том, что кадры создаются в Keep.__init__, а не при запуске show_frame(), поэтому PageTwo.__init__() выполняется в начале, а текст Welcome... создается в начале - еще до того, как вы увидите StartPage.

Вы должны создать пустую метку в __init__ и создать текст Welcome... в другом методе (например, update_widgets()), который вы будете выполнять после show_frame() или события внутри show_frame(), если все классы будут иметьupdate_widgets()>


Минимальный рабочий код:

import tkinter as tk


class Keep(tk.Tk):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.shared_data ={
            "email": tk.StringVar(),
            "password": tk.StringVar()
        }

        self.frames = {
            'StartPage': StartPage(self, self),
            'PageTwo': PageTwo(self, self),
        }

        self.current_frame = None
        self.show_frame('StartPage')

    def show_frame(self, name):
        if self.current_frame:
            self.current_frame.forget()
        self.current_frame = self.frames[name]
        self.current_frame.pack()

        self.current_frame.update_widgets() # <-- update data in widgets


class StartPage(tk.Frame):

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

        self.entry1 = tk.Entry(self, textvariable=self.controller.shared_data["email"])
        self.entry1.pack()
        entry2 = tk.Entry(self, show='*')
        entry2.pack()
        button = tk.Button(self, text="Submit", command=lambda:controller.show_frame("PageTwo"))
        button.pack()

    def update_widgets(self):
        pass

class PageTwo(tk.Frame):

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

        self.label = tk.Label(self, text="") # <-- create empty label
        self.label.pack()

    def update_widgets(self):
        self.label["text"] = "Welcome, {}".format(self.controller.shared_data["email"].get()) # <-- update text in label


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