Python Forum
Unable to return value from callback function of a button in Python Tkinter
Thread Rating:
  • 1 Vote(s) - 2 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Unable to return value from callback function of a button in Python Tkinter
#1
Hi Team

I am trying to get the input written in an Entry box using Tkinter, But whenever I am trying to do so I am not getting the desired result..Instead a None is getting returned. Please help My code is given below
from Tkinter import *

class menu:
    def __init__(self,master):
        self.master=master
        self.var1 = StringVar()
        self.entry = Entry(self.master,textvariable=self.var1)
        self.entry.pack(side=TOP)
        self.var2 = StringVar()
        self.value=self.get_value()
        self.button = Button(self.master,text='Hit Me',command = self.get_value)
        self.button.pack(side=TOP)

    def get_value(self):
         self.value= self.var1.get()

if __name__=="__main__":
    root = Tk()
    Menu = menu(root)
    print Menu.value
    root.mainloop()
Output:
None
in this while printing Menu.value I am getting None instead off getting what I entered into Entry.Please help.Thanks in advance.
Reply
#2
1. Don't flood namespace.
from Tkinter import *
this is better.
import Tkinter as tk
Example. Every thing seems to be working find.
import Tkinter as tk

class Menu:
    def __init__(self,master):
        self.master=master
        self.var1 = tk.StringVar()
        self.entry = tk.Entry(self.master, textvariable=self.var1)
        self.entry.pack(side=tk.TOP)

        self.button = tk.Button(self.master,text='Hit Me',command = self.get_value)
        self.button.pack(side=tk.TOP)
        self.value = None

    def get_value(self):
        print(self.entry.get())
        print(self.var1.get())
        self.value = self.entry.get()
        print(self.value)

if __name__=="__main__":
    root = tk.Tk()
    menu = Menu(root)
    root.mainloop()
99 percent of computer problems exists between chair and keyboard.
Reply
#3
(Aug-05-2018, 12:58 PM)Windspar Wrote: 1. Don't flood namespace.
from Tkinter import *
this is better.
import Tkinter as tk
Example. Every thing seems to be working find.
import Tkinter as tk

class Menu:
    def __init__(self,master):
        self.master=master
        self.var1 = tk.StringVar()
        self.entry = tk.Entry(self.master, textvariable=self.var1)
        self.entry.pack(side=tk.TOP)

        self.button = tk.Button(self.master,text='Hit Me',command = self.get_value)
        self.button.pack(side=tk.TOP)
        self.value = None

    def get_value(self):
        print(self.entry.get())
        print(self.var1.get())
        self.value = self.entry.get()
        print(self.value)

if __name__=="__main__":
    root = tk.Tk()
    menu = Menu(root)
    root.mainloop()

Hi Windspar,
Thanks for your input.But what I want is to return the input value to a variable in the main program so that I can use t for other purpose. Actually my idea is to make one FTP GUI app so that user will provide input in GUI app & after the pressing Hit Me button the main program will be able to fetch the input details of user from this GUI. In this program if I am trying to return a value the output is coming as None. So, please tell me how I can use this input in entry box to another program? Again thank you very much for your input.
Reply
#4
You never going to be able to print anything in the main area.
Program must run first. Then when program ends. All widgets are destroyed. All this happens when mainloop is called.

Example
import Tkinter as tk

class Main:
    root = tk.Tk()
    value = "None"

class Menu:
    def __init__(self, master):
        self.master = master
        self.entry = tk.Entry(self.master)
        self.entry.pack(side=tk.TOP)
        self.button = tk.Button(master,text='Hit Me',command = self.get_value)
        self.button.pack(side=tk.TOP)
        self.button_send = tk.Button(master, text="Get Text", command=self.get_text)
        self.button_send.pack()
        self.label = tk.Label(master, text=Main.value)
        self.label.pack()

    def get_value(self):
        Main.value = self.entry.get()

    def get_text(self):
        #self.label['text'] = self.entry.get()
        self.label['text'] = Main.value


if __name__=="__main__":
    Main.menu = Menu(Main.root)
    Main.root.mainloop()
99 percent of computer problems exists between chair and keyboard.
Reply
#5
It has to go after the mainloop(), otherwise you print it before tkinter runs, i.e
    root.mainloop()
    print Menu.value 
Note that classes use UpperCase and variables use lower_case_with_underscores. You should also state that you are using Python2.X, which is the exception, as Python3 is what most people are using (Python2 reaches end of life in 2020).
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  tkinter showing image in button rwahdan 3 365 Jun-16-2021, 06:08 AM
Last Post: Yoriz
  return a variable from a function snakes 3 756 Apr-09-2021, 06:47 PM
Last Post: snakes
  tkinter button image Nick_tkinter 4 818 Mar-04-2021, 11:33 PM
Last Post: deanhystad
  tkinter get function finndude 2 562 Mar-02-2021, 03:53 PM
Last Post: finndude
  tkinter -- after() method and return from function -- (python 3) Nick_tkinter 12 1,023 Feb-20-2021, 10:26 PM
Last Post: Nick_tkinter
  tkinter python button position problem Nick_tkinter 3 811 Jan-31-2021, 05:15 AM
Last Post: deanhystad
  TKinter restarting the mainloop when button pressed zazas321 7 2,094 Jan-26-2021, 06:38 AM
Last Post: zazas321
  tkinter touchscreen scrolling - button press makes unwanted scrolling nanok66 1 777 Dec-28-2020, 10:00 PM
Last Post: nanok66
  Using Tkinter inside function not working Ensaimadeta 3 725 Dec-23-2020, 02:57 PM
Last Post: deanhystad
  function in new window (tkinter) Dale22 7 918 Nov-24-2020, 11:28 PM
Last Post: Dale22

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020