Question

I've been playing with combining entry widgets with tuples in python 2.7 tkinter. With this code, I should be able to enter the name of a fruit, search for it in the fruit bowl tuple, and if it's in there, display the characteristics of that fruit using a set of radiobuttons.

from Tkinter import*

class Fruit:
    def __init__(self, parent):

        # variables
        self.texture_option = StringVar()
        self.climate_option = StringVar()

        # layout
        self.myParent = parent

        self.main_frame = Frame(parent, background="light blue")
        self.main_frame.pack(expand=YES, fill=BOTH)

        texture_options = ["Soft", "Crunchy","?"]
        climate_options = ["Temperate", "Tropical","?"]

        self.texture_option.set("?")
        self.climate_option.set("?")

        self.texture_options_frame = Frame(self.main_frame, borderwidth=3, background="light blue")
        self.texture_options_frame.pack(side=TOP, expand=YES, anchor=W)
        Label(self.texture_options_frame, text="Texture:", relief=FLAT, font="bold", background="light blue").pack(side=LEFT,anchor=W)
        for option in texture_options:
            button = Radiobutton(self.texture_options_frame, text=str(option), indicatoron=0,
            value=option, padx=5, variable=self.texture_option, background="light blue")
            button.pack(side=LEFT)

        self.climate_options_frame = Frame(self.main_frame, borderwidth=3, background="light blue")
        self.climate_options_frame.pack(side=TOP, expand=YES, anchor=W)
        Label(self.climate_options_frame, text="Climate:", relief=FLAT, font="bold", background="light blue").pack(side=LEFT,anchor=W)
        for option in climate_options:
            button = Radiobutton(self.climate_options_frame, text=str(option), indicatoron=0,
            value=option, padx=5, variable=self.climate_option, background="light blue")
            button.pack(side=LEFT)

        #search button
        self.search_frame = Frame(self.main_frame, borderwidth=5, height=50, background="light blue")
        self.search_frame.pack(expand=NO)

        enter = Entry(self.search_frame, width=30).pack(side=LEFT, expand=NO, padx=5, pady=5, ipadx=5, ipady=5)

        self.searchbutton = Button(self.search_frame, text="Search", foreground="white", background="blue",
        width=6, padx="2m", pady="1m")
        self.searchbutton.pack(side=LEFT, pady=5)
        self.searchbutton.bind("<Button-1>", self.searchbuttonclick)
        self.searchbutton.bind("<Return>", self.searchbuttonclick)


    def searchbuttonclick(self,event):
        #fruit  texture  climate 
        fruit_bowl=[
        ('Apple', 'Crunchy','Temperate'),
        ('Orange', 'Soft','Tropical'),
        ('Pawpaw','Soft','Temperate')]

        if enter.get()==fruit_bowl[x][0]:
            self.texture_option.set()==fruit_bowl[x][1]
            self.climate_option.set()==fruit_bowl[x][2]

root = Tk()
root.title("Fruit Bowl")
fruit = Fruit(root)
root.mainloop()

I am getting an error message, Name Error: global name 'enter' is not defined. Does anyone know why this refuses to work?

Was it helpful?

Solution

The problem is that you define the "enter" variable locally in one method of your object, and then tries to access it in another method - where it does not exist as a local variable (therefore Python searches it as a global variable, and as it does not find it, it raises the message error you saw).

It is easy to fix: just set the enter variable to be an attribute of your "Fruit" class, by prefixing it with self. everywhere it is used - thus it will be available for all methods of your object -

Namely, change this line:

enter = Entry(self.search_frame, width=30).pack(side=LEFT, expand=NO, padx=5, pady=5, ipadx=5, ipady=5)

to:

self.enter = Entry(self.search_frame, width=30).pack(side=LEFT, expand=NO, padx=5, pady=5, ipadx=5, ipady=5)

And

if enter.get()==fruit_bowl[x][0]: to if self.enter.get()==fruit_bowl[x][0]:

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top