Python - 从另一个类访问局部变量

时间:2021-02-08 23:05:30

标签: python class inheritance tkinter frames

我试图尽可能地压缩代码以明确我在问什么......

我有一个名为 chosen_name 的变量,在名为 booking_frame 的类中确定,我想在 calendar_frame 类中访问该变量。

因此,很明显 calendar_frame 继承了 booking_frame 的属性 - 但是,我相信(我可能完全错了哈哈)calendar_frame 必须继承这些特征Frame 以便整个程序正常运行。

calendar_frame 是一个完全独立的类的原因是它可以作为不同的框架出现。

非常感谢您提供的任何帮助:)


# import tkinter modules
from tkinter import *
from tkinter import ttk
import tkinter.font as tkFont
from PIL import ImageTk, Image
from tkcalendar import *



# define self
class tkinterApp(Tk):

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

        Tk.__init__(self, *args, **kwargs)

        # creating a container
        container = Frame(self)
        container.pack(side = "top", fill = "both", expand = True)

        container.grid_rowconfigure(0, weight = 1)
        container.grid_columnconfigure(0, weight = 1)

        # initialising frames to an empty array
        self.frames = {}

        menu_bar = Menu(container)
        main_menu = Menu(menu_bar)

        menu_bar.add_cascade(label="Main Menu", menu=main_menu)
        main_menu.add_command(label="Welcome page", command=lambda: self.show_frame(welcome_frame))
        main_menu.add_command(label="Book a vehicle", command=lambda: self.show_frame(booking_frame))
        main_menu.add_command(label="Register as new user", command=lambda: self.show_frame(register_frame))

        Tk.config(self, menu=menu_bar)

        for F in (welcome_frame, booking_frame, register_frame, calendar_frame):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row = 0, column = 0, sticky = "nsew")

        self.show_frame(welcome_frame)

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


class welcome_frame(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)

        welcome = Label(self, text="Hello, please use the menu above to navigate the interface")
        welcome.grid(row=0, column=4, padx=10, pady=10)

class register_frame(Frame):

    def __init__(self, parent, controller):

        Frame.__init__(self, parent)

        register_label = Label(self, text="New user - enter your details below to use the Collyer's car park.")
        register_label.grid()


class booking_frame(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)

        chosen_name = "Steve"


class calendar_frame(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)

    print(booking_frame.chosen_name)


app = tkinterApp()
app.geometry("1000x800")
app.title("Collyer's Car Park")
app.mainloop()

2 个答案:

答案 0 :(得分:1)

首先需要在chosen_name类内部将局部变量self.chosen_name改为实例变量booking_frame,否则类外部无法访问:

class booking_frame(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)

        self.chosen_name = "Steve"  # changed to instance variable

然后您可以通过 controller.frames[booking_frame].chosen_name 类中的 calendar_frame 访问它:

class calendar_frame(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)

        print(controller.frames[booking_frame].chosen_name)

答案 1 :(得分:0)

继承是对行为相同的对象的关系进行建模(“IS A”关系)。它并不意味着在对象之间共享数据。

您的问题的一个可能解决方案是使用第三个对象,该对象将被共享 booking_framecalendar_frame 之间。

这个对象可以是一个 Python 字典,例如;你可以把它传递给你所有的 “框架”对象,或者你可以决定让它全局化(当然不是很学术,但又快又脏):

GLOBAL_STATE = {}

class booking_frame(Frame):
    ...
    GLOBAL_STATE["chosen_name"] = "Steve"

class calendar_frame(Frame):
    ...
    print(GLOBAL_STATE.get("chosen_name"))

我希望您现在可以看到如何重构代码以在这些对象之间共享数据。

相关问题