Python Forum
Nested while loop problem + turtle
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
Reply
#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.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#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.
Reply
#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
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
Photo Problem installing turtle MasterJediKnight7 17 24,301 Mar-18-2024, 10:22 AM
Last Post: bmohamadyar313
  While Loop Problem Benno2805 1 536 Sep-06-2023, 04:51 PM
Last Post: deanhystad
  Big O runtime nested for loop and append yarinsh 4 1,331 Dec-31-2022, 11:50 PM
Last Post: stevendaprano
  Nested for loops - help with iterating a variable outside of the main loop dm222 4 1,531 Aug-17-2022, 10:17 PM
Last Post: deanhystad
  Loop reading csv file problem faustineaiden 1 1,539 Dec-11-2021, 08:40 AM
Last Post: ibreeden
  Problem with nested JSON Kalet 7 2,719 Dec-09-2021, 11:13 PM
Last Post: Gribouillis
  How do I add another loop to my nested loop greenpine 11 4,440 Jan-12-2021, 04:41 PM
Last Post: greenpine
  Error on nested loop : Invalid syntax dvazquezgu 3 3,177 Nov-25-2020, 10:04 AM
Last Post: palladium
  Infinite loop problem Zirconyl 5 2,923 Nov-16-2020, 09:06 AM
Last Post: DeaD_EyE
  Nested function problem chipx 8 3,413 Oct-21-2020, 11:56 PM
Last Post: jefsummers

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020