从抽象方法更新 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()
提供什么参数来指示 self
或 TestPage
的当前实例.在 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()
我正在尝试更新 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()
提供什么参数来指示 self
或 TestPage
的当前实例.在 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()