Получение / установка переменных Tkinter в контроллере / архитектура представления - ошибка атрибута - PullRequest
0 голосов
/ 08 февраля 2019

Этот вопрос адресован всем, кто знаком с кодом "psudeo-mvc" и вопросами, связанными с примером пользовательского интерфейса Брайана Окли в Tkinter здесь - К сожалению, у меня недостаточно репутации, чтобы просто комментироватьсуществующий вопрос.

Я прочитал все ссылки исходного вопроса и до сих пор не могу понять, что не так с моим кодом.Единственное отличие, которое я вижу, состоит в том, что я помещаю свои разные классы «view» HomeWindow, OutfileWindow, TestWindow в отдельные файлы python и поэтому импортирую их в контроллер, чтобы он мог их видеть - очевидно, что-то мне не хватает ... Итак, вопросэто:

В двух моих классах просмотра HomeWindow и OutfileWindow Я пытаюсь получить и установить значения в словаре shared_data.Почему я получаю AttributeError в переменной shared_data?

Вот соответствующий код контроллера:

import Tkinter as T        
import HomeWindow
import OutfileWindow
import TestWindow

## This class inherits from Tkinter.Tk class.
class Controller(T.Tk):

    ## constructor for our PSSE Plotting Application
    def __init__(self, *args, **kwargs):

        T.Tk.__init__(self, *args, **kwargs)
        T.Tk.title(self, "My Application")
        self.configure(background = COLOR_WINDOW)

        ## Build a container frame within the root TK window that will hold all other widgets.
        containerFrame = T.Frame(self)
        containerFrame.configure(bg=COLOR_FRAME)
        containerFrame.grid(row=0,column=0,sticky='nsew')
        containerFrame.grid_rowconfigure(0, weight=1)
        containerFrame.grid_columnconfigure(0, weight=1)

        ## build a dictionary of windows (tk frames) hashed by each frame's __name__ variable
        windows = (   HomeWindow.HomeWindow, 
                      OutfileWindow.OutfileWindow, 
                      TestWindow.TestWindow            )

        ## list of Frame Class __name__ variables which will act as keys
        self.windowKeys = []
        ## dictionary Frame Class Objects
        self.windowDictionary = {}
        for frameClass in windows:
            windowKey = frameClass.__name__
            self.windowKeys.append(windowKey)
            window = frameClass(parent=containerFrame, controller=self)
            self.windowDictionary[windowKey] = window
            window.grid(row=0, column=0, sticky="nsew")

        ## Call up the main window.
        self.show_window("HomeWindow")

        ## ---------------------------------------------------------------------------
        ## dictionary of data that is accessible to all classes via the controller 
        self.shared_data = {
            # file management
            "cwd"              :  T.StringVar(),
            "cwdSet"           :  T.BooleanVar(),
            "allOutfiles"      :  [],
            "selectedOutfiles" :  [],
            "allCsvfiles"      :  [],
            "selectedCsvfiles" :  [],
            # data managment
            "allChannels"      :  [],
            "selectedChannels" :  [],  
            "allColumns"       :  [],
            "selectedColumns"  :  [],
            # plot(s) management
            "plot_titles"      :  [],
            "xlabels"          :  [],
            "ylabels"          :  [],
            # Room for more....
            "test"             :  "Hello World"
        }

    def show_window(self, windowKey):
        window = self.windowDict[windowKey]
        window.tkraise()
        window.refresh()

И здесь я получаю ошибки, когда пытаюсьполучить доступ / использовать значения, содержащиеся в shared_data:

class HomeWindow(T.Frame):

    def __init__(self, parent, controller):
        T.Frame.__init__(self,parent)
        self.controller = controller
        print self.controller.shared_data["test"]

И снова здесь:

class OutfileWindow(T.Frame):
    def __init__(self, parent, controller):
        T.Frame.__init__(self,parent)
        self.controller = controller
        self.controller.shared_data["cwd"].set("Specify a directory...")
        self.controller.shared_data["cwdSet"].set(False)

Вот ошибка для первого экземпляра: (второй - та же ошибка ипеременная)

> python27 Controller.py
  Traceback (most recent call last):
  File "Controller.py", line 211, in <module>
    main()
  File "Controller.py", line 199, in main
    PlottingApplication = Controller()
  File "Controller.py", line 71, in __init__
    window = frameClass(parent=containerFrame, controller=self)
  File "C:\Users\user\Documents\004_MyTools\005_Plotter\HomeWindow.py", line 37, in __init__
    print self.controller.shared_data["test"]
  File "C:\Program Files (x86)\Python27\lib\lib-tk\Tkinter.py", line 1903, in __getattr__
    return getattr(self.tk, attr)
  AttributeError: shared_data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...