[Tkinter-discuss] Multiple windows, accessing variables across them won't work for me (Using Tkinter)

Rlain robert.hedman at mac.com
Sun Aug 22 06:45:30 CEST 2010


Hi!
I've been working on this app last days, and can't get passed this problem:
I've created two windows, (one is created by a button click in the first
window), and from the other window I want to change some variables defined
in the first window.

I'm guessing either I haven't understood the whole parent thingy, or messed
up somewhere there.

The source code is:
(there's some translations and explanations below)


#!/usr/bin/python
# -*- coding: utf-8 -*-

from __future__ import division
import Tkinter


class enhetsomvandlare_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()


    def initialize(self):
        self.grid()

        self.LV = Tkinter.StringVar()
        label = Tkinter.Label(self,textvariable=self.LV,
                              anchor="w",fg="white",bg="blue")
        label.grid(column=0,row=0,columnspan=1,sticky='EW')
        self.LV.set(u"Lbs to Kg")

	global enhet
	enhet = "lbstokg"


        self.entryVariable1 = Tkinter.StringVar()
        self.entry = Tkinter.Entry(self,textvariable=self.entryVariable1)
        self.entry.grid(column=0,row=1,sticky='W')
        self.entry.bind("<Return>", self.OnPressEnter)
        self.entryVariable1.set(u"")

        self.entryVariable2 = Tkinter.StringVar()
        self.entry = Tkinter.Entry(self,textvariable=self.entryVariable2)
        self.entry.grid(column=1,row=1,sticky='W')
        self.entry.bind("<Return>", self.OnPressEnter)
        self.entryVariable2.set(u"")



        raknaknapp = Tkinter.Button(self,text=u"Räkna ut!",
                                command=self.Onraknaknapp1)
        raknaknapp.grid(column=2,row=1)

        Change_units = Tkinter.Button(self,text=u"Change Units",
                                command=self.OnChange_units)
        Change_units.grid(column=1,row=2)


        self.grid_columnconfigure(0,weight=1)
        self.grid_columnconfigure(1,weight=1)
        self.grid_columnconfigure(2,weight=1)
        self.resizable(True,False)
        self.update()
        self.geometry(self.geometry())




    def Onraknaknapp1(self):
	if enhet == "lbstokg":
		lbs = float(self.entryVariable1.get())
		kg = lbs / 0.455
		self.entryVariable2.set(kg)

	elif enhet == "kgtolbs":
		kg = float(self.entryVariable1.get())
		lbs = kg * 0.455
		self.entryVariable2.set(lbs)



    def OnChange_units(self):

	class Change_units_tk(Tkinter.Tk):
	    def __init__(self,parent):
	        Tkinter.Tk.__init__(self,parent)
	        self.parent = parent
	        self.initialize()

	    def initialize(self):
	        self.grid()

	        self.LV2 = Tkinter.StringVar()
	        label = Tkinter.Label(self,textvariable=self.LV2,
	        	                      anchor="w",fg="white",bg="blue")
	        label.grid(column=0,row=0,columnspan=2,sticky='EW')
	        self.LV2.set(u"Choose Unit...")

		kgtolbs = Tkinter.Button(self,text=u"Kg to lbs",
                                command=self.Onkgtolbs)
        	kgtolbs.grid(column=0,row=1)

		lbstokg = Tkinter.Button(self,text=u"Lbs to kg",
                                command=self.Onlbstokg)
        	lbstokg.grid(column=1,row=1)

	        self.grid_columnconfigure(0,weight=1)
	        self.grid_columnconfigure(1,weight=1)
	        self.grid_columnconfigure(2,weight=1)
	        self.resizable(True,False)
	        self.update()
	        self.geometry(self.geometry())

	    def Onkgtolbs(self):
		self.LV.set("Kg to lbs")
		global enhet
		enhet = "kgtolbs"

	    def Onlbstokg(self):
		self.LV.set("Lbs to kg")
		global enhet
		enhet = "lbstokg"


	if __name__ == "__main__":
	    app = Change_units_tk(enhetsomvandlare_tk)
	    app.title("What unit?")


    def OnPressEnter(self,event):
        self.LV.set( "Hej" )



if __name__ == "__main__":
    app = enhetsomvandlare_tk(None)
    app.title("Robert's Enhetsomvandlare")
    app.mainloop()



(Some things are swedish, so I'll translate them to make this easier to
understand)
Legend for my code:

enhet = unit
LV = Labelvariable
raknaknapp = calculatebutton
Räkna ut = calculate






Now as soon as I get the crossover thing to work I'll start adding more
math, functions and other things to it to make it useful. But right now I
want to get rid of this error message:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "/home/robert/Desktop/programmering/python/12 enhets
omvandlare/12.py", line 118, in OnChange_units
    app = Change_units_tk(enhetsomvandlare_tk)
  File "/home/robert/Desktop/programmering/python/12 enhets
omvandlare/12.py", line 78, in __init__
    Tkinter.Tk.__init__(self,parent)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1646, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive,
wantobjects, useTk, sync, use)
TypeError: create() argument 1 must be string or None, not classobj

OR

when i have the line:
 app = Change_units_tk(enhetsomvandlare_tk)
changed to:
 app = Change_units_tk(None)
I will get the error message:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "/home/robert/Desktop/programmering/python/12 enhets
omvandlare/12.py", line 107, in Onkgtolbs
    self.LV.set("Kg to lbs")
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1725, in __getattr__
    return getattr(self.tk, attr)
AttributeError: LV

Which is the one I really don't get...



Anyways, I've searched the net for some help, but couldn't find anything
really helpful. (I know I probably missed it, but this was easier... :P)

Help is appreciated, (I'm a first time poster).

Have a nice day! :)

/Robert
-- 
View this message in context: http://old.nabble.com/Multiple-windows%2C-accessing-variables-across-them-won%27t-work-for-me-%28Using-Tkinter%29-tp29503063p29503063.html
Sent from the Python - tkinter-discuss mailing list archive at Nabble.com.



More information about the Tkinter-discuss mailing list