从抽象方法更新 class 实例 StringVar()

Update class instance StringVar() from abstract method

我正在尝试更新 4 StringVar() 为打开文件后只读的值。我正在尝试在 class TestPage 上使用抽象方法 set_values() 来更新 4 StringVar()

...

class TestPage(Tk.Frame):

    def __init__(self, parent, *controller):

        Tk.Frame.__init__(self, parent)

        self.x = Tk.StringVar()
        self.y = Tk.StringVar()
        self.z = Tk.StringVar()
        self.w = Tk.StringVar()

    ...
        x_label = ttk.Label(self, textvariable=self.x)
        y_label = ttk.Label(self, textvariable=self.x)
        z_label = ttk.Label(self, textvariable=self.x)
        w_label = ttk.Label(self, textvariable=self.x)
    ...

    def set_values(self):
        self.x.set(some.list[0])
        self.y.set(some.other_list.last_index)
        self.z.set(some.list_total_entries)
        self.w.set('herro worr')
...

TestPage 继承自 Tk.Frame。我相信我 'instantiate' 是 TestPage 对象,当我在主 Application class 中调用 show_frame() 时,它继承自 Tk:

# ***** Tkinter Gui classes *****
# Main container, called by app.gui.Application() in main.py
class Application(Tk.Tk):
    def __init__(self, *args, **kwargs):
        Tk.Tk.__init__(self, *args, **kwargs)

        container = Tk.Frame(self, name='container')
        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 (EntryPage, TestPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(EntryPage)

    # ***** Change view/frame *****
    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

    # ***** Open file *****
    def open_file(self):
        functions.load_file()

...

我想从单独的 functions 模块中现有的 load_file 函数调用 set_values()。我调用 load_file() 来填充图形,并解析为打开选择的文件。

...
def load_file():
    ...
    if file_name:
        gui.TestPage.set_values()
    ...
...

当我尝试时出现错误:

TypeError: unbound method set_values() must be called with TestPage instance as first argument (got nothing instead)

我需要在 TestPage 的实例化实例上调用该方法,但我不明白要向 set_values() 提供什么参数来指示 selfTestPage 的当前实例.在 Application class 中,我认为我在行 frame = F(container, self) 中将 TestPage 实例化为 frame。但是我也无法使用 frame 引用 set_values()

我什至不确定这是最好的方法。我尝试用绑定、事件以及 @classmethod@staticmethod 替换该方法,但没有真正成功。我应该为此使用抽象方法吗?

您要更改的值是对象的属性,因此您需要通过实例更改它们。换句话说,不要将某些东西传递给 class 或抽象函数的 "self" 参数,只需在对象本身上调用函数即可。

例如:

...
testfile = TestPage(...)
...
load_file(testpage)
...

def load_file(page):
    ...
    page.set_values()