从抽象方法

时间:2015-05-10 17:07:03

标签: python-2.7 oop methods tkinter instance-variables

我正在尝试使用仅在打开文件后读取的值更新4 StringVar()。我尝试在类set_values()上使用抽象方法TestPage来更新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。我相信我会实例化'我在主TestPage课程中致电show_frame()的{​​{1}}对象,该课程来自Application

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() ... 函数中调用set_values(),该函数位于单独的load_file模块中。我调用functions来填充图表,并解析为开放而选择的文件。

load_file()

当我尝试时,我收到错误:

  

TypeError:必须使用TestPage实例作为第一个参数调用未绑定方法set_values()(没有取而代之)

我需要在实例化的TestPage实例上调用该方法,但我不明白要向... def load_file(): ... if file_name: gui.TestPage.set_values() ... ... 提供哪个参数来指示set_values()self的当前实例。在TestPage课程中,我认为我在行Application中将TestPage实例化为frame。但我无法使用frame = F(container, self)引用set_values()

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

1 个答案:

答案 0 :(得分:1)

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

例如:

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

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