Skip to content
Advertisement

NameError: global name ‘END’ is not defined

I have found this code about scrollbar is just working fine.

from tkinter import *

master = Tk()

scrollbar = Scrollbar(master)
scrollbar.pack(side=RIGHT, fill=Y)

listbox = Listbox(master, yscrollcommand=scrollbar.set)
for i in range(10000):
    listbox.insert(END, str(i))
listbox.pack(side=LEFT, fill=BOTH)

scrollbar.config(command=listbox.yview)

mainloop()

I try to use it in my code like this:

import tkinter as tk

class interface(tk.Frame):
    def __init__(self,den):
        self.tklist() 
        #in my code, tklist is not called here. I called it here to minimize the code
        #there are stuff in here also

    def tklist(self):
        scrollbar = tk.Scrollbar(den)
        self.lst1 = tk.Listbox(den, selectmode="SINGLE", width="100", yscrollcommand=scrollbar.set)
        for i in range(1000):
            self.lst1.insert(END, str(i))
        self.lst1.pack(side=LEFT, fill=BOTH)
        scrollbar.config(command=lst1.yview)

den = tk.Tk()
den.title("Search")

inter = interface(den)

den.mainloop()

But when I ran above code, I got an error on insertion line.

NameError: global name 'END' is not defined

By the way, I tried to find documentation and a link from effbot is the closest I got but still couldn’t understand what is wrong.

Advertisement

Answer

END, LEFT, and BOTH all reside in the tkinter namespace. Thus, they need to be qualified by placing tk. before them:

for i in range(1000):
    self.lst1.insert(tk.END, str(i))
self.lst1.pack(side=tk.LEFT, fill=tk.BOTH)
scrollbar.config(command=lst1.yview)

Or, you could import them explicitly if you want:

from tkinter import BOTH, END, LEFT
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement