tchadwik
tchadwik

Reputation: 1629

updating listbox from another class in tkinter

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

Answers (1)

user849425
user849425

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

Related Questions