Почему эта программа регистрирует щелчки в одном прямоугольнике, а в круге, а не во втором? - PullRequest
0 голосов
/ 31 октября 2019

Я разработал функцию регистрации кликов в прямоугольниках и кружке. Самый левый прямоугольник будет регистрировать щелчки соответственно. Я не могу получить клики, чтобы зарегистрироваться в самом правом прямоугольнике или круге. Что мне здесь не хватает?

Я сделал функцию, которая различает круг и прямоугольник и регистрирует щелчки мыши внутри них.

from graphics import*
from time import sleep

def main():
    win,c=make()
    blue=Rectangle(Point(0,200),Point(100,300))
    blue.draw(win)
    blue.setFill("blue")
    yellow=Rectangle(Point(500,200),Point(400,300))
    yellow.draw(win)
    yellow.setFill("yellow")
    green=Rectangle(Point(300,0),Point(200,100))
    green.draw(win)
    green.setFill("green")
    dx,dy=3,-6
    z=0.1
    while True: 
        c.move(dx,dy)
        sleep(z)
        center = c.getCenter()
        dx,dy = bounce(dx,dy,center)
        bump=win.checkMouse()
        if bump != None:
            if isClicked(bump,blue):
                z+=0.05
            elif isClicked(bump,yellow):
                z-=0.05
            elif isClicked(bump,c):
                win.close


def bounce(dx,dy,center):
    if center.getX()<25 or center.getX()>475:
        dx *= -1
    if center.getY()<25 or center.getY()>475:
        dy *= -1
    return dx,dy


def isClicked(click, shape):

    if not click:
        return False
    x,y = click.getX(), click.getY()   
    if type(shape).__name__ == 'Circle':
        center = shape.getCenter()
        cx, cy = center.getX(), center.getY()
        if ((x-cx)**2 + (y-cy)**2)**.5 <= 25:
            return True
    else:
        x1, y1 = shape.getP1().getX(), shape.getP1().getY()
        x2, y2 = shape.getP2().getX(), shape.getP2().getY()
        if (x1 < x < x2) and (y1 < y < y2):
            return True
    return False

def make():
    win = GraphWin('Exam2-1',500,500)
    win.setBackground('grey')
    c = Circle(Point(250,250),25)
    c.setFill('blue')
    c.draw(win)

    return win, c
main()

Теоретически, нажатие на синий прямоугольник должно замедлить движение шара, в то время как нажатие на желтый прямоугольник должно увеличить его. Кроме того, щелчок в круге должен закрыть окно. В настоящее время синий прямоугольник является единственным с функциональностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...