Bottom Page

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 Nested while loop problem + turtle
#1
Here's a bit of info. I am creating a simple program (for now) that takes an image, makes it black and white, then using turtle, draws it on the screen.

from PIL import Image 
from turtle import *

image_path = "image.png"
loaded_image = None
x, y, old_x = 0, 0, 0

def convert_img():
    image_file = Image.open(image_path)
    image_file = image_file.convert('L')
    image_file.save('bw_image.png')

def get_pix_col(pixels, x, y):
    return pixels[x,y]
    
def draw(img, pixels):
    global old_x, x ,y
    while x < img.size[0]:
        while y < img.size[1]:
            pendown()
            brightness = get_pix_col(pixels, x, y)
            color(brightness, brightness, brightness)
            if(x == old_x):
                goto((-img.size[0]/2) + x, (-img.size[1]/2) + y)
            else:
                penup()
                goto((-img.size[0]/2) + x, (-img.size[1]/2) + y)
            old_x = x
            y += 1
        x += 1
    done()

def main():
    convert_img()
    loaded_image = Image.open('bw_image.png')
    pix = loaded_image.load()
    canvas_setup(loaded_image)
    draw(loaded_image, pix)

def canvas_setup(img):
    colormode(255)
    setup(img.size[0], img.size[1])
    bgcolor(0, 0, 0)
    speed(10)
    penup()
    setposition(-img.size[0], -img.size[1])
    
main()
The first problem with this is the nested while loops. They should go:
Output:
x,y: 0,0 0,1 0,2 0,3 0,4 ...
until 'y' reaches, 562 in the case of my image. But it is whatever the 'y' size of the image is.
When y is this the output becomes:
Output:
1,0 1,1 1,2 ...
over and over until 'x' is equal to the x size of the image (1000 in my case).
However the problem is, 'x' never increments, it always is 0. There's got to be a simple fix but I can't find it. The only reason I am not using a nested for loop is so that I can increment 'x' and 'y' with different values.

The other problem is how can I speed up the turtle? I am already using 'speed(10)' but it is still very slow when drawing. If I can speed it up a lot that would be nice!

Thanks,
Dream
Quote
#2
You need to reset y to 0. When x is 0 and y reaches img.size[1], the inner loop ends. Then x is incremented, and it checks the inner loop's condition again. But since you didn't reset y, it skips the loop and increments x again, until the outer loop is done. So when you increment x, reset y.
DreamingInsanity likes this post
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures

Quote
#3
(Jul-06-2019, 11:27 AM)ichabod801 Wrote: You need to reset y to 0. When x is 0 and y reaches img.size[1], the inner loop ends. Then x is incremented, and it checks the inner loop's condition again. But since you didn't reset y, it skips the loop and increments x again, until the outer loop is done. So when you increment x, reset y.

Ohhh right. I forgot about that!

Thanks.
Quote
#4
As for speeding it up - I now have this:
from PIL import Image 
from turtle import *

image_path = "image.png"
loaded_image = None
x, y, old_x = 0, 0, 0

def convert_img():
    image_file = Image.open(image_path)
    image_file = image_file.convert('L')
    image_file.save('bw_image.png')

def get_pix_col(pixels, x, y):
    return pixels[x,y]
    
def draw(img, pixels):
    global old_x, x ,y
    while x < img.size[0]:
        while y < img.size[1]:
            pendown()
            brightness = get_pix_col(pixels, x, y)
            color(brightness, brightness, brightness)
            if(x == old_x):
                goto((-img.size[0]/2) + x, (img.size[1]/2) - y)
            else:
                penup()
                goto((-img.size[0]/2) + x, (img.size[1]/2) - y)
            old_x = x
            y += 1
        update()
        x += 1
        y = 0
    done()

def main():
    convert_img()
    loaded_image = Image.open('bw_image.png')
    pix = loaded_image.load()
    canvas_setup(loaded_image)
    draw(loaded_image, pix)

def canvas_setup(img):
    colormode(255)
    setup(img.size[0], img.size[1])
    bgcolor(0, 0, 0)
    tracer(0, 0)
    speed("fastest")
    penup()
    setposition(-img.size[0] / 2, img.size[1] / 2)
    
main()
All it does now is update the screen only once one line of the x has been completed. The auto screen refresh was disabled.
It is considerably faster than before, however, even with my image (1000x563) It still takes over 5 mins to draw it on the canvas.
What else can I do to speed it up?

EDIT: explanation
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  Problem with append list in loop michaelko03 0 95 Feb-16-2020, 07:04 PM
Last Post: michaelko03
  Nested Loop for user input Ads 2 167 Dec-30-2019, 11:44 AM
Last Post: Ads
  openpyxl nested for loop help rmrten 3 403 Oct-16-2019, 03:11 PM
Last Post: stullis
  nested for loop dilemma YoungGrassHopper 9 428 Sep-13-2019, 03:56 AM
Last Post: jsira2003
  nested for loop dilemma 2 YoungGrassHopper 12 515 Sep-12-2019, 02:06 PM
Last Post: YoungGrassHopper
  problem with for loop using integers python_germ 5 343 Aug-31-2019, 11:42 AM
Last Post: jefsummers
  problem in loop roseojha 3 207 Aug-26-2019, 09:03 AM
Last Post: perfringo
  Problem Passing Arguement to do loop stephenmolnar 10 838 May-13-2019, 02:56 PM
Last Post: Gribouillis
  Index error using pop in nested loop PerksPlus 3 542 Mar-28-2019, 03:11 PM
Last Post: ichabod801
  Nested for loop strange problem mcva 2 470 Mar-16-2019, 12:53 PM
Last Post: mcva

Forum Jump:


Users browsing this thread: 1 Guest(s)