2015-05-10 1 views
-1

Я пытаюсь обновить 4 StringVar() со значениями, считанными только после открытия файла. Я пытаюсь использовать абстрактный метод set_values() по классу TestPage для обновления 4 StringVar().Обновить экземпляр класса 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 inherets от Tk.Frame. Я считаю, что «Instantiate» TestPage объекта, когда я звоню show_frame() в главном Application класса, который inherets из 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(), чтобы сделать некоторое заполнение графов и проанализировать файл, выбранный для открытия.

... 
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)

Мне нужно вызвать метод на конкретизированной экземпляре тестовой страницы, но я не понимаю, какой параметр поставлять set_values() указать self или текущий экземпляр TestPage. В классе Application я думал, что создавал TestPage как frame в строке frame = F(container, self). Но я не смог ссылаться на set_values(), используя frame.

Я даже не уверен, что это лучший способ сделать это. Я попытался заменить метод связями, событиями, а также @classmethod и @staticmethod, но без реальных успехов. Должен ли я использовать абстрактный метод для этого?

+1

Что? Откуда вы ожидаете появления «парсера»? Вы когда-нибудь на самом деле * создавали экземпляр 'TestPage'? – jonrsharpe

+0

Я использую класс Application, который устанавливает tk, и использует словарь и отдельный метод для переключения между кадрами. «Парсер» - третий уже реализованный модуль, он «анализирует» файл для значений, которые я хотел бы присвоить «StringVar()», и помещает их в разные списки, извините, я мог бы упомянуть об этом :) – djoe

+0

@jonrsharpe Я отредактировал свой вопрос и удалил ссылку на синтаксический анализатор и попытался указать, что TestPage фактически экземпляр. Я думал, что эта деталь не имеет значения для вопроса. Все остальное, чем конкретная проблема в вопросе, который вы можете предположить, работает правильно. Я не понимаю нисходящего, но спасибо за попытку помочь :) – djoe

ответ

1

Значения, которые вы меняете, являются атрибутами объекта, поэтому вам нужно изменить их с помощью экземпляра. Другими словами, не передавайте что-либо «самому» параметру класса или абстрактной функции, просто вызовите функцию на самом объекте.

Например:

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

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

Огромное вам спасибо, я верю, что сейчас я на правильном пути, но не совсем там ... Я обновил свой вопрос, чтобы дать вам лучше картина механики, мой проект основан на онлайн-примере, и я борюсь со стороной ООП. В принципе, я (думаю) Я знаю, что я создаю «TestPage», когда показываю фрейм, но я не могу понять, как ссылаться на текущий отображаемый кадр. Спасибо, что нашли время, я думаю, я должен был задать вопрос лучше с самого начала :) – djoe