Fireye
Fireye

Reputation: 59

Global variable not getting set in Python turtle event handler

I'm trying to make a connect 4 game in Python turtle graphics, and it was going well, but then this happened: xy simply won't change! Here is the code:

import turtle
from turtle import *
from turtle import Turtle, Screen
speed(0)
xy = 1
def circle1 ():
    forward(90)
    fillcolor("white")
    begin_fill()
    circle(40)
    end_fill()
def getCoords(x,y):
    global xy
    #print("( " + str(x) + ", " + str(y) + " )")
    if y < 252 and x < -316:
        print ("test")
        xy = 1
    elif y < 252 and x > -316 and x < -187:
        xy = 2
    elif y < 252 and x > -187 and x < -59:
        xy = 3
    elif y < 252 and x > -59 and x < 65:
        xy = 4
    elif y < 252 and x > 65 and x < 194:
        xy = 5
    elif y < 252 and x > 194 and x < 327:
        xy = 6
    elif y < 252 and x > 327 and x < 453:
        xy = 7
window = Screen()
wn = window
wn.screensize()
wn.setup(width = 1.0, height = 1.0)
begin_fill()
width(5)
penup()
goto(-450,250)
right(90)
pendown()
forward(580)
left(90)
forward(450*2)
left(90)
forward(580)
left(90)
forward(450*2)
end_fill()
right(180)
forward(30)
right(90)
forward(50)
fillcolor("white")
begin_fill()
circle(40)
end_fill()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
goto(-450,250)
left(90)
forward(160)
right(90)
forward(50)
fillcolor("white")
begin_fill()
circle(40)
end_fill()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
penup()
goto(-450,250)
pendown()
left(90)
forward(290)
right(90)
forward(50)
fillcolor("white")
begin_fill()
circle(40)
end_fill()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
penup()
goto(-450,250)
pendown()
left(90)
forward(410)
right(90)
forward(50)
fillcolor("white")
begin_fill()
circle(40)
end_fill()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
penup()
goto(-450,250)
pendown()
left(90)
forward(540)
right(90)
forward(50)
fillcolor("white")
begin_fill()
circle(40)
end_fill()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
penup()
goto(-450,250)
pendown()
left(90)
forward(670)
right(90)
forward(50)
fillcolor("white")
begin_fill()
circle(40)
end_fill()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
penup()
goto(-450,250)
pendown()
left(90)
forward(800)
right(90)
forward(50)
fillcolor("white")
begin_fill()
circle(40)
end_fill()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
circle1 ()
turtle.onscreenclick(getCoords)
turtle.listen()
if xy == 1:
    textinput("test","dis is 1")

For some odd reason when I tabbed everything over it copied a part of it, so ignore that last bit.

Upvotes: 0

Views: 891

Answers (1)

cdlane
cdlane

Reputation: 41905

it was going well

You know things aren't really going well when you import the same module three different ways:

import turtle
from turtle import *
from turtle import Turtle, Screen

xy simply won't change!

It is changing, but there's nothing in your code that is capable of displaying the change. The only statement that looks at xy:

if xy == 1:
    textinput("test","dis is 1")

completes before xy ever changes and is never run again. Let's add some code to display xy in the turtle window so you can see your clicks are having an effect. While we're at it, we'll clean up your code:

from turtle import *

def circle6():
    fillcolor("white")
    for _ in range(6):
        begin_fill()
        circle(40)
        end_fill()
        forward(90)

def getCoords(x, y):
    global xy

    if y < 252:
        if x < -316:
            xy = 1
        elif -316 < x < -187:
            xy = 2
        elif -187 < x < -59:
            xy = 3
        elif -59 < x < 65:
            xy = 4
        elif 65 < x < 194:
            xy = 5
        elif 194 < x < 327:
            xy = 6
        elif 327 < x < 453:
            xy = 7

        marker.undo()
        marker.write("xy = {}".format(xy), xy, font=('Arial', 18, 'normal'))

xy = 0

wn = Screen()
wn.setup(width=1.0, height=1.0)

marker = Turtle(visible=False)
marker.penup()
marker.goto(0, 300)
marker.write("xy = {}".format(xy), font=('Arial', 18, 'normal'))

hideturtle()
speed('fastest')
penup()

goto(-450, 250)
right(90)

begin_fill()
forward(580)
left(90)
forward(450 * 2)
left(90)
forward(580)
left(90)
forward(450 * 2)
end_fill()

left(90)

for distance in range(25, 815, 130):

    goto(-450, 250)
    left(90)
    forward(distance)
    right(90)
    forward(60)

    circle6()

wn.onscreenclick(getCoords)

wn.mainloop()

enter image description here

Upvotes: 1

Related Questions