How to access a variable from one tab in another tab of a notebook?

Alan Gauld alan.gauld at yahoo.co.uk
Thu Apr 8 06:06:01 EDT 2021


On 08/04/2021 06:01, Mohsen Owzar wrote:

>> But this is why GUIs are often(usually?) built as a class 
>> because you can store all the state variables within 
>> the instance and access them from all the methods. 
>>
>> You can do it with functions but you usually wind up 
>> with way too many globals to be comfortable.

> Because I'm a newbie in Python and write programs since 
> a couple of months, and I'm not so familiar with classes, 

OK, In that case you should probably read up on classes
and play around with them to get used to the ideas of
classes, objects and methods.

You can carry on using functions but you will need to
keep track of quite a lot of global variables which
can get messy in bigger programs. Classes just keep
things a bit more tidy.

> would be very nice to give me a code, how I have to 
> change my code into a class form.
> I tried without a class and I ran into problems that 
> the defined frame and entry are not defined.

One of the problems in your code is that you are not
storing references to the widgets you create. You are
relying on the containment tree to store the references
and keep them alive. But that makes it difficult to
access. As a general rule of thumb if you are creating
any widget that responds to events you should keep
a reference to it - ie. create a variable.

For example in your code you have a section like this:

def gen_t2(frame):
  def getValue(event):...

  lbl = Label(frame, text='Val').pack()

  ent = Entry(frame)
  ent.pack()
  ent.insert(0, '2')

  ent.bind('<Return>', getValue)

And you call it like this:

    if firstTime2 == 1:    if firstTime2 == 1:
      gen_t2(tab2)
      firstTime2 = 0

      gen_t2(tab2)
      firstTime2 = 0

Inside the function you store a reference to the Entry as ent.
but ent disappears as soon as the function ends, you cannot
use ent to access your entry outside the function.
You need to return the widget like so:

def gen_t2(frame):
  def getValue(event):...

  ...
  ent.bind('<Return>', getValue)
  return ent

And then call it like:

   if firstTime2:
      entry_field = gen_t2(tab2)
      firstTime2 = False

Now you can access your Entry field via the global
variable entry_field.

I suspect you should forget about the classes for now, focus
on getting the functions to work, especially returning values
and storing those in global variables that you can access from
elsewhere. These principles are just as important when you
get round to studying classes later.

And remember that global variables in one module can be
accessed from another module by importing the first module
into the second and using the module name as prefix.

import tab2

txt = tab2.entry_field.get()

HTH

You might also find the functions, namespaces and GUI sections
of my tutorial useful (see below).

-- 
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos




More information about the Python-list mailing list