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

Я делаю приложение, используя tkinter, и я хочу получить доступ к глобальной переменной, которой я присваиваю значение из записи tkinter, введенной пользователем. Я следую шаблону MVC для создания приложения, и каждое окно находится в своем собственном классе, и я в основном борюсь с использованием данных из одного класса в другой. В этом контексте я хочу напечатать имя пользователя, введенное пользователем в метку в классе PageThree. Я сделал здесь минимально воспроизводимую версию кода:

import tkinter as tk
from tkinter import font as tkfont
from tkinter import messagebox


stored_username = "Tessa"


class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")


        container = tk.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 (PageTwo, PageThree):
            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("PageTwo")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class PageTwo(tk.Frame):

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

        self.label_username_signup = tk.Label(self, text="Username")
        self.label_password_signup = tk.Label(self, text="Password")

        self.entry_username_signup = tk.Entry(self)
        self.entry_password_signup = tk.Entry(self, show="*")

        self.label_username_signup.grid(row=0, sticky=tk.E)
        self.label_password_signup.grid(row=1, sticky=tk.E)
        self.entry_username_signup.grid(row=0, column=1)
        self.entry_password_signup.grid(row=1, column=1)

        self.rgbtn = tk.Button(self, text="Register", command=self.log_details)
        self.rgbtn.grid(columnspan=3)

        button = tk.Button(self, text="Back",
                       command=lambda: controller.show_frame("StartPage"))
        button.grid()

    def log_details(self):
        username = self.entry_username_signup.get()
        global stored_username
        stored_username = username
        if username:
            self.controller.show_frame("PageThree")
        else:
            tk.messagebox.showerror("Login Failure", "Incorrect username or password, please try again")


class PageThree(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        self.controller = controller
        global stored_username
        lbl = tk.Label(self,text=name_entry)
        lbl.grid(row=0,column=0)


def name_entry():
    global stored_username
    string = stored_username.get()
    return string


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

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

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