user8458838
user8458838

Reputation:

Getting variable out of Tkinter

I would like to ask if anyone knows how to get out a variable from an Entry in Tkinter to be used in future calculation.

Let us assume that I want to create a prompt where the user needs to place two numbers in the two different Entry widgets.

These numbers are to be used in another script for calculation. How can I retrieve the values from the prompt created in Tkinter?

In my opinion, I would need to create a function with the code bellow and make it return the value from the Tkinter prompt. However, I cannot return the numbers because I'm destroying the root window. How can I get pass this, preferably without global variables.

Best Regards

from tkinter import *
from tkinter import ttk

#Start of window
root=Tk()
#title of the window
root.title('Title of the window')


def get_values():
    values=[(),(value2.get())]

    return values




# Creates a main frame on the window with the master being the root window
mainframe=ttk.Frame(root, width=500, height=300,borderwidth=5, relief="sunken")
mainframe.grid(sticky=(N, S, E, W))


###############################################################################
#
#
# Label of the first value
label1=ttk.Label(master=mainframe, text='First Value')
label1.grid(column=0,row=0)

# Label of the second value
label2=ttk.Label(master=mainframe, text='Second Value')
label2.grid(column=0,row=1)




###############################################################################
#
#
# Entry of the first value
strvar1 = StringVar()
value1 = ttk.Entry(mainframe, textvariable=strvar1)
value1.grid(column=1,row=0)

# Entry of the second value
strvar2 = StringVar()
value2 = ttk.Entry(mainframe, textvariable=strvar2)
value2.grid(column=1,row=1)


# Creates a simplle button widget on the mainframe
button1 = ttk.Button(mainframe, text='Collect', command=get_values)
button1.grid(column=2,row=1)



# Creates a simplle button widget on the mainframe
button2 = ttk.Button(mainframe, text='Exit', command=root.destroy)
button2.grid(column=2,row=2)




root.mainloop()

Upvotes: 0

Views: 4324

Answers (3)

Nae
Nae

Reputation: 15355

  1. In python, functions are objects, as in get_values is an object.
  2. Objects can have attributes.

Using these two, and the knowledge that we can't really return from a button command, we can instead attach an attribute to an already global object and simply use that as the return value.

Example with button

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


def on_button_press(entry):
    on_button_press.value = entry.get()
    entry.quit()


def main():
    root = tk.Tk()
    entry = tk.Entry(root)
    tk.Button(root, text="Get Value!", command=lambda e = entry : on_button_press(e)).pack()
    entry.pack()
    tk.mainloop()
    return on_button_press.value


if __name__ == '__main__':
    val = main()
    print(val)

Minimalistic example

  1. Similarly modules are also objects, if you want to avoid occupying global namespace extremely, you can attach a new attribute to the module you're using

See:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


if __name__ == '__main__':
    tk.my_value = lambda: [setattr(tk, 'my_value', entry.get()), root.destroy()]
    root = tk.Tk()
    entry = tk.Entry(root)
    root.protocol('WM_DELETE_WINDOW', tk.my_value)
    entry.pack()
    tk.mainloop()
    print(tk.my_value)

Upvotes: 0

user8458838
user8458838

Reputation:

So, I have taken Curly Joe's example and made a function with the his sketch

The final result, for anyone wanting to use this as a template for a input dialog box:

def input_dlg():
 import tkinter as tk
 from tkinter import ttk


class GetEntry():

    def __init__(self, master):


        self.master=master
        self.master.title('Input Dialog Box')
        self.entry_contents=None

        ## Set point entries

        # First point
        self.point1 = ttk.Entry(master)
        self.point1.grid(row=0, column=1)
        self.point1.focus_set()

        # Second point
        self.point2 = ttk.Entry(master)
        self.point2.grid(row=1, column=1)
        self.point2.focus_set()


        # labels
        ttk.Label(text='First Point').grid(row=0, column=0)
        ttk.Label(text='Second Point').grid(row=1, column=0)
        ttk.Button(master, text="Done", width=10,command=self.callback).grid(row=5, column=2)



    def callback(self):
        """ get the contents of the Entries and exit the prompt"""
        self.entry_contents=[self.point1.get(),self.point2.get()]
        self.master.destroy()

master = tk.Tk()
GetPoints=GetEntry(master)
master.mainloop()

Points=GetPoints.entry_contents

return list(Points)

Upvotes: 0

user4171906
user4171906

Reputation:

You use a class because the class instance and it's variables remain after tkinter exits.https://www.tutorialspoint.com/python/python_classes_objects.htm And you may want to reexamine some of your documentation requirements, i.e. when the statement is "root.title('Title of the window')", adding the explanation "#title of the window" is just a waste of your time..

""" A simplified example
"""

import sys
if 3 == sys.version_info[0]:  ## 3.X is default if dual system
    import tkinter as tk     ## Python 3.x
else:
    import Tkinter as tk     ## Python 2.x

class GetEntry():
    def __init__(self, master):
        self.master=master
        self.entry_contents=None
        self.e = tk.Entry(master)
        self.e.grid(row=0, column=0)
        self.e.focus_set()


        tk.Button(master, text="get", width=10, bg="yellow",
               command=self.callback).grid(row=10, column=0)

    def callback(self):
        """ get the contents of the Entry and exit
        """
        self.entry_contents=self.e.get()
        self.master.quit()

master = tk.Tk()
GE=GetEntry(master)
master.mainloop()

print("\n***** after tkinter exits, entered =", GE.entry_contents)

Upvotes: 2

Related Questions