freeaks
freeaks

Reputation: 487

python tkinter image layers (paste / unpaste image on background)

i have a background image using tkinter canvas, and i'm adding images on top of it. so far so good it works well. but what i would like to do is to be able to remove some of the forground images on demand. and when i remove some of them i would like to see the background behind them as it were before adding those forground images on it.

that would be like: paste 5 foreground images and then remove 1 or 2 of them. so this program i have to far, adds little white filled circles at random position. if i keep a handle on every little white circles (i can put them in variables and have them all in a list, and get their coordinates later for example). how can i remove some of them and get to see my background behind the removed whites circles ? is it even possible ?

#!/usr/bin/env python3
from tkinter import *
from PIL import Image, ImageTk
from random import *

class App(object):

    def __init__(self):
        self.root =  Tk()
        self.canvas = Canvas(self.root, height=222, width=227)
        self.canvas.grid()
        # small nature landscape
        self.backgnd = PhotoImage( file = "images/nature.png" )
        # small white circle 
        self.mycloud = PhotoImage( file = "images/white.png" )
        backgnd_width = (self.backgnd.width()/2)
        backgnd_height = (self.backgnd.height()/2)
        self.canvas.create_image(backgnd_width,backgnd_height,image=self.backgnd)

    def cloud(self):
        pos_x = randint(1,220)
        pos_y = randint(1,220)
        self.canvas.create_image(pos_x,pos_y, image=self.mycloud)


app = App()
app.cloud()
app.cloud()
app.cloud()
app.cloud()
app.cloud()
app.root.mainloop() 

enter image description here

Upvotes: 0

Views: 3645

Answers (2)

Rishi
Rishi

Reputation: 3578

made a few changes to make above code compatible with python 2:

from Tkinter import *
from PIL import Image, ImageTk
import ttk
from random import *

class App(object):

    def __init__(self):
        self.root =  Tk()
        self.canvas = Canvas(self.root, height=300, width=227)
        self.canvas.grid()
        self.mylist=[]

        self.backgnd = ImageTk.PhotoImage( Image.open("sunshine.jpg") )
        self.mycloud = ImageTk.PhotoImage( Image.open("Y.png") )
        backgnd_width = (self.backgnd.width()/2)
        backgnd_height = (self.backgnd.height()/2)
        self.canvas.create_image(backgnd_width,backgnd_height,image=self.backgnd)

        # button to remove things on the canvas
        button_del = ttk.Button(self.root, text='Del')
        button_del['command'] = self.rem
        button_del.place(x=100, y=250)

    def cloud(self):
        # add 5 object at random position on the canvas
        for idx in range(5):
            pos_x = randint(1,220)
            pos_y = randint(1,220)
            self.mylist.append(self.canvas.create_image(pos_x,pos_y, image=self.mycloud))

    def rem(self):
        # delete elements placed on the canvas
        self.canvas.delete(self.mylist[-1])
        self.mylist.pop()


app = App()
app.cloud()
app.root.mainloop()

Upvotes: 0

freeaks
freeaks

Reputation: 487

in case it might help others here's a working solution. i added a button that will remove each object placed on the canvas, one a a time. (thanks for the help, Bryan Oakley)

#!/usr/bin/env python3
from tkinter import *
from PIL import Image, ImageTk
from tkinter import ttk
from random import *

class App(object):

    def __init__(self):
        self.root =  Tk()
        self.canvas = Canvas(self.root, height=300, width=227)
        self.canvas.grid()
        self.mylist=[]

        self.backgnd = PhotoImage( file = "images/nature.png" )
        self.mycloud = PhotoImage( file = "images/white.png" )
        backgnd_width = (self.backgnd.width()/2)
        backgnd_height = (self.backgnd.height()/2)
        self.canvas.create_image(backgnd_width,backgnd_height,image=self.backgnd)

        # button to remove things on the canvas
        button_del = ttk.Button(self.root, text='Del')
        button_del['command'] = self.rem
        button_del.place(x=100, y=250)

    def cloud(self):
        # add 5 object at random position on the canvas
        for idx in range(5):
            pos_x = randint(1,220)
            pos_y = randint(1,220)
            self.mylist.append(self.canvas.create_image(pos_x,pos_y, image=self.mycloud))

    def rem(self):
        # delete elements placed on the canvas
        self.canvas.delete(self.mylist[-1])
        self.mylist.pop()


app = App()
app.cloud()
app.root.mainloop()

Upvotes: 2

Related Questions