Reputation: 1629
What i'm trying to do is in the onopen function in Controller class i'm trying to run the update_listbox function in the View class which will update the listbox. This is giving me the error update_listbox() must be called with View instance as first argument. I don't fully understand what i'm doing so it would be very helpful if someone could explain to me what i'm doing wrong here and how to do it correctly.
cheers tchadwik
from Tkinter import *
import tkMessageBox
import tkFileDialog
from tkFileDialog import askopenfilename
from tkMessageBox import askokcancel
class Controller(object):
def __init__(self, master=None):
self._master = master
#filemenubar
self.menu()
#listbox
self.listboxFrame = View(master)
self.listboxFrame.pack(fill=BOTH, expand=YES)
#entry widget
self.EntryFrame = Other(master)
self.EntryFrame.pack(fill = X)
def menu(self):
menubar = Menu(self._master)
self._master.config(menu=menubar)
fileMenubar = Menu(menubar)
fileMenubar.add_command(label="Open Products File", command=self.onopen)
fileMenubar.add_command(label="Save Products File", command=self.onsave)
fileMenubar.add_command(label="exit", command=self.onExit)
menubar.add_cascade(label="File", menu=fileMenubar)
def onopen(self):
fname = askopenfilename()
products.load_items(fname)
View.update_listbox() #
#this gives me error stating that it needs View instance as first argument
#and adding self here only gives it the controller instance
class View(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.list = Listbox(self, selectmode=EXTENDED)
self.list.pack(fill=BOTH, expand=YES)
self.current = None
self.update_listbox()
def update_listbox(self):
temp=products.get_keys()
for i in temp:
self.list.insert(END, str(products.get_item(i)))
Upvotes: 1
Views: 1117
Reputation:
You need to instantiate a View
object. For example:
def onopen(self):
fname = askopenfilename()
products.load_items(fname)
myview = View(self._master) # Instantiate the object
myview.update_listbox() # Now call update_listbox()
This is because the memory for the member variables (for example: self.list
) is not allocated until the object is instantiated. Or another way to put it is that self.list
is not created until View.__init__()
is called, which happens when you create a View
object from the View
class definition.
Upvotes: 3