pythontkintersysmud

Why won't .get() iterate and work in Tkinter?


Im making this client for my networking class, its supposed to connect to a MUD server that our professor has set up but im having a problem in the entry widget in Tkinter, when the "Enter" button is pressed the text in the entry widget is supposed to be printed to the shell from the submit_value() function, but i get an error saying that the entry widget does not exist when .get() is called from it,can anyone help me figure out this error?

from tkinter import *
from sys import exit

def button_func():
        print("Test")

def submit_value():
        print("Entered Value: %s" % (userEntry.get()))

class TestClient(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.pack()

        for n in range(3):
            self.grid_rowconfigure(n, weight=1)

        for n in range(8):
            self.grid_columnconfigure(n, weight=1)

        lb1 = Listbox(self, width=20,height=24)
        lb1.insert(1,"WoW")
        lb1.grid(row=0, column=0, columnspan=2, sticky='news')

        t1 = Text(self, width=60)
        t1.grid(row=0, column=3, columnspan=3)

        lb2 = Listbox(self, width=20,height=24)
        lb2.insert(1,"Hi")
        lb2.grid(row=0, column=6, columnspan=2, sticky='news')

        la1 = Label(self, text="Value entry:")
        la1.grid(row=1, column=0)

        userEntry = StringVar()
        e1 = Entry(self, width=40, textvariable=userEntry)
        e1.grid(row=1, column=1, columnspan=6)

        e2 = Button(self, text="Enter", command=submit_value)
        e2.grid(row=1, column=5, columnspan=10)


        b1 = Button(self, text="Start", width=10,padx=10,pady=10, command=button_func)
        b1.grid(row=2, column=0)

        b2 = Button(self, text="Change Room", width=10,padx=10,pady=10, command=button_func)
        b2.grid(row=2, column=3)

        b3 = Button(self, text="FIGHT", width=10,padx=10,pady=10, command=button_func)
        b3.grid(row=2, column=4)

        b4 = Button(self, text="PvP FIGHT", width=10,padx=10,pady=10, command=button_func)
        b4.grid(row=2, column=5)

        b5 = Button(self, text="Loot", width=10,padx=10,pady=10, command=button_func)
        b5.grid(row=2, column=6)

        b6 = Button(self, text="Leave", width=10,padx=10,pady=10, command=button_func)
        b6.grid(row=2, column=7)

        stats = Listbox(self, width= 20)
        stats.insert(1,"health:")
        stats.grid(row=3, column=0, columnspan=8, sticky='news')

root = Tk()
root.title = "Test program"
tw = TestClient(root)
root.mainloop()

Solution

  • userEntry is a local variable to TestClient.__init__. It cannot be used outside the scope of the function. You can get around this by using global variables:

    from tkinter import *
    from sys import exit
    
    userEntry = object
    
    def button_func():
        print("Test")
    
    def submit_value():
        global userEntry
        print("Entered Value: %s" % (userEntry.get()))
    
    class TestClient(Frame):
        def __init__(self, master):
            global userEntry
            Frame.__init__(self, master)
            self.pack()
    
            for n in range(3):
                self.grid_rowconfigure(n, weight=1)
    
            for n in range(8):
                self.grid_columnconfigure(n, weight=1)
    
            lb1 = Listbox(self, width=20,height=24)
            lb1.insert(1,"WoW")
            lb1.grid(row=0, column=0, columnspan=2, sticky='news')
    
            t1 = Text(self, width=60)
            t1.grid(row=0, column=3, columnspan=3)
    
            lb2 = Listbox(self, width=20,height=24)
            lb2.insert(1,"Hi")
            lb2.grid(row=0, column=6, columnspan=2, sticky='news')
    
            la1 = Label(self, text="Value entry:")
            la1.grid(row=1, column=0)
    
            userEntry = StringVar()
            e1 = Entry(self, width=40, textvariable=userEntry)
            e1.grid(row=1, column=1, columnspan=6)
    
            e2 = Button(self, text="Enter", command=submit_value)
            e2.grid(row=1, column=5, columnspan=10)
    
    
            b1 = Button(self, text="Start", width=10,padx=10,pady=10, command=button_func)
            b1.grid(row=2, column=0)
    
            b2 = Button(self, text="Change Room", width=10,padx=10,pady=10, command=button_func)
            b2.grid(row=2, column=3)
    
            b3 = Button(self, text="FIGHT", width=10,padx=10,pady=10, command=button_func)
            b3.grid(row=2, column=4)
    
            b4 = Button(self, text="PvP FIGHT", width=10,padx=10,pady=10, command=button_func)
            b4.grid(row=2, column=5)
    
            b5 = Button(self, text="Loot", width=10,padx=10,pady=10, command=button_func)
            b5.grid(row=2, column=6)
    
            b6 = Button(self, text="Leave", width=10,padx=10,pady=10, command=button_func)
            b6.grid(row=2, column=7)
    
            stats = Listbox(self, width= 20)
            stats.insert(1,"health:")
            stats.grid(row=3, column=0, columnspan=8, sticky='news')
    
    root = Tk()
    root.title = "Test program"
    tw = TestClient(root)
    root.mainloop()
    

    The above code creates userEntry as a global variable so it can be used anywhere throughout the program.