Этот вопрос адресован всем, кто знаком с кодом "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