Глобальная переменная не устанавливается в обработчике событий черепахи Python - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь сделать игру connect 4 с графикой черепах Python, и все шло хорошо, но потом это произошло: xy просто не изменится!Вот код:

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")

По какой-то странной причине, когда я вкладывал все поверх него, копировал его часть, поэтому проигнорируйте этот последний бит.

1 Ответ

0 голосов
/ 19 декабря 2018

все шло хорошо

Вы знаете, что на самом деле дела идут плохо, когда вы импортируете один и тот же модуль тремя разными способами:

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

xy просто не изменится!

Это меняется , но в вашем коде нет ничего, что могло бы отобразить это изменение.Единственное утверждение, которое смотрит на xy:

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

, завершается до того, как xy когда-либо изменится, и никогда больше не будет выполнено.Давайте добавим некоторый код для отображения xy в окне черепахи, чтобы вы могли видеть, что ваши клики дают эффект.Пока мы это делаем, мы очистим ваш код:

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

...