Bharath Gupta
Bharath Gupta

Reputation: 344

Calling of variable in python

Hii I have a requirement of calling the variable in function which is having it declaration and definition in another function.Could any one help me please.

import sys
import os
import tkMessageBox
from Tkinter import *
from tkCommonDialog import Dialog
import shutil
import tkFileDialog
import win32com.client

win = Tk()
win.title("Copying the Directory to specified location")
win.geometry("600x600+200+50")
win.resizable()
global src
global des
class Copy():
    #global src
    #global des
    def __init__(self):
        def srce():
            src = tkFileDialog.askdirectory(title = "The source folder is ")
            textboxsrc.delete(0,END)
            textboxsrc.insert(0,src)
            print src
            return src

        textboxsrc = Entry(win, width="70")
        textboxsrc.insert(0,'Enter master file name')
        textboxsrc.pack()
        textboxsrc.place(relx=0.40, rely=0.06, anchor=CENTER)
        bu = Button(text = "Source",font = "Verdana 12 italic bold",bg = "Purple",fg= "white", command= srce)
        bu.pack(fill =X, expand=YES)
        bu.place(relx=0.85, rely=0.06, anchor=CENTER)

        def dest():
            des = tkFileDialog.askdirectory(title = "TheDestination folder is ")
            textboxdes.delete(0,END)
            textboxdes.insert(0,des)
            print des
            return des

        textboxdes = Entry(win, width="70")
        textboxdes.insert(0,'Enter master file name')
        textboxdes.pack()
        textboxdes.place(relx=0.40, rely=0.13, anchor=CENTER)
        bu1 = Button(text = "Destination",font = "Verdana 12 italic",bg = "Purple",fg= "white", command= dest)
        bu1.pack(fill =X, expand=YES)
        bu1.place(relx=0.85, rely=0.13, anchor=CENTER)

        def start():
            #global src
            #global des
            #abc = os.path.dirname(src)
            #dgh = os.path.dirname(des)
            try:
                shutil.copy(src,des)
            except :
                tkMessageBox.showwarning("Copying file",  "Error while copying\n(%s)" )

        bn =Button(text = "Copy",font = "Verdana 12 italic", bg = "Purple",fg= "white",command=start)
        bn.pack(fill =X, expand = YES)
        bn.place(relx=0.50, rely=0.25, anchor=CENTER)

obj= Copy()
#obj.source(win)
#obj.destination(win)
win.mainloop()

Here,I get an error in the start() function. giving me the problem of accepting src and des variable.

Upvotes: 1

Views: 2011

Answers (4)

Bharath Gupta
Bharath Gupta

Reputation: 344

import sys
import os
import tkMessageBox
from Tkinter import *
from tkCommonDialog import Dialog
import shutil
import tkFileDialog
import win32com.client

win = Tk()
win.title("Copying the Directory to specified location")
win.geometry("600x600+200+50")
win.resizable()


class Copy(object):


    def __init__(self):
        def srce():

            self.src = tkFileDialog.askdirectory(title="The source folder is ")
            textboxsrc.delete(0, END)
            textboxsrc.insert(0, self.src)
            print self.src
            return self.src

        textboxsrc = Entry(win, width="70")
        textboxsrc.insert(0, 'Enter master file name')
        textboxsrc.pack()
        textboxsrc.place(relx=0.40, rely=0.06, anchor=CENTER)
        bu = Button(text="Source", font="Verdana 12 italic bold", bg="Purple", fg="white", command=srce)
        bu.pack(fill=X, expand=YES)
        bu.place(relx=0.85, rely=0.06, anchor=CENTER)

        def dest():
            self.des = tkFileDialog.askdirectory(title="TheDestination folder is ")
            textboxdes.delete(0, END)
            textboxdes.insert(0, self.des)
            print self.des
            return self.des

        textboxdes = Entry(win, width="70")
        textboxdes.insert(0, 'Enter master file name')
        textboxdes.pack()
        textboxdes.place(relx=0.40, rely=0.13, anchor=CENTER)
        bu1 = Button(text="Destination", font="Verdana 12 italic", bg="Purple", fg="white", command=dest)
        bu1.pack(fill=X, expand=YES)
        bu1.place(relx=0.85, rely=0.13, anchor=CENTER)

        def start():


            try:
                shutil.copytree(self.src, self.des)
            except :
                tkMessageBox.showwarning("Copying file", "Error while copying\n(%s)")

        bn = Button(text="Copy", font="Verdana 12 italic", bg="Purple", fg="white", command=start)
        bn.pack(fill=X, expand=YES)
        bn.place(relx=0.50, rely=0.25, anchor=CENTER)

obj = Copy()
#obj.source(win)
#obj.destination(win)
win.mainloop()

Upvotes: 0

Richard Logwood
Richard Logwood

Reputation: 3273

i updated your code (and made the corrections needed after reading your feedback) to use class variables/attributes and fixed your error message, check it out. Please note, using class variables means you can only use this class as a singleton, only one of these classes can be used at a time because every instance would use the same Copy.src, Copy.des, Copy.textboxsrc and Copy.textboxdsc variables.

import sys
import os
import tkMessageBox
from Tkinter import *
from tkCommonDialog import Dialog
import shutil
import tkFileDialog
import win32com.client

win = Tk()
win.title("Copying the Directory to specified location")
win.geometry("600x600+200+50")
win.resizable()

# force "new" Python class by inheriting from "object"
class Copy(object):

    # use class attributes for shared variables
    src = None
    des = None
    textboxsrc = None
    textboxdes = None

    def srce():
        # access the class attributes via "Copy." syntax
        Copy.src = tkFileDialog.askdirectory(title = "The source folder is ")
        Copy.textboxsrc.delete(0,END)
        Copy.textboxsrc.insert(0,Copy.src)
        print Copy.src
        return Copy.src

    textboxsrc = Entry(win, width="70")
    textboxsrc.insert(0,'Enter master file name')
    textboxsrc.pack()
    textboxsrc.place(relx=0.40, rely=0.06, anchor=CENTER)
    bu = Button(text = "Source",font = "Verdana 12 italic bold",bg = "Purple",fg= "white", command= srce)
    bu.pack(fill =X, expand=YES)
    bu.place(relx=0.85, rely=0.06, anchor=CENTER)

    def dest():
        # access the class attributes via "Copy." syntax
        Copy.des = tkFileDialog.askdirectory(title = "TheDestination folder is ")
        Copy.textboxdes.delete(0,END)
        Copy.textboxdes.insert(0,Copy.des)
        print Copy.des
        return Copy.des

    textboxdes = Entry(win, width="70")
    textboxdes.insert(0,'Enter master file name')
    textboxdes.pack()
    textboxdes.place(relx=0.40, rely=0.13, anchor=CENTER)
    bu1 = Button(text = "Destination",font = "Verdana 12 italic",bg = "Purple",fg= "white", command= dest)
    bu1.pack(fill =X, expand=YES)
    bu1.place(relx=0.85, rely=0.13, anchor=CENTER)

    def start():
        # access the class attributes via "Copy." syntax
        print "copy src(%s) to des(%s)" % (Copy.src,Copy.des)
        try:
            shutil.copy(Copy.src,Copy.des)
        except:
            tkMessageBox.showwarning("Copying file",  "Error while copying\n(%s) to (%s)\n%s\n%s"
            % (Copy.src,Copy.des, sys.exc_info()[0], sys.exc_info()[1]) )


    bn =Button(text = "Copy",font = "Verdana 12 italic", bg = "Purple",fg= "white",command=start)
    bn.pack(fill =X, expand = YES)
    bn.place(relx=0.50, rely=0.25, anchor=CENTER)

obj= Copy()
win.mainloop()

Upvotes: 3

wim
wim

Reputation: 362707

Rather thank mucking around with global keyword, your class methods need to be bound to the parent object. Looks like you really need to work through a tutorial about python's scoping rules.

  class Copy(object):
    def __init__(self):
      # don't define further methods in here!

    def srce(self):
      self.src = ...

    def dest(self):
      self.des = ..

    def start(self):
      #Here you can access self.des and self.src

Upvotes: 1

Raymond Hettinger
Raymond Hettinger

Reputation: 226306

Python provides nested scopes (which may be what you're after) but it does provide one function with access to local variables of another function at the same level. If the latter is what you need, consider using a global variable.

See the tutorial for a discussion of scoping. Also, see the language reference for a discussion of global declarations.

In the following example, global is used to declare a variable that can be accesses and written in two different functions:

def f():
    global x
    x = 1

def g():
    global x
    x = 2

Here is an example of a nested scope where an inner function can read but not write a variable in an enclosing function:

def f():
    x = 1
    def g():
        print(x)
    return g

In Python 3, the nonlocal keyword was added to support writing to x from the inner function:

def f():
    x = 1
    def g():
        nonlocal x
        x += 1
    g()
    print(x)

Upvotes: 1

Related Questions