Можно ли вычеркнуть ранее нарисованную фигуру из oop? Zelle Graphics Python - PullRequest
0 голосов
/ 05 января 2020

Мне было интересно, можно ли отрисовать ранее нарисованные фигуры из всех oop. У меня есть эта функция, которая будет создавать квадраты при щелчке, но я хочу сделать так, чтобы при повторном нажатии на ту же область квадрат исчезал.

from graphics import *


def createGrid():
    X = 0
    Y = 0
    gridSize = 5
    for i in range(1, gridSize + 1):
        for j in range(1, gridSize + 1):
            gridSquare = Rectangle(Point(X, Y), Point(X + 100, Y + 100))
            gridSquare.draw(win)
            X = X + 100
        Y = Y + 100
        X = 0


def editMode():
    SelectedSquare = []
    instruction = input("> ")
    if instruction == "s":
        selectionMode(SelectedSquare)


def selectionMode(SelectedSquare):
    editSquare = Rectangle(Point(0, 0), Point(20, 20))
    editSquare.setFill("black")
    editSquare.draw(win)
    while True:
        selection = win.getMouse()
        clickXPos = selection.getX()
        clickYPos = selection.getY()
        if clickXPos > 20 and clickYPos > 20:
            PosX, PosY = clickXPos - (clickXPos % 100), clickYPos - (clickYPos % 100)
            SelectedSquare = SelectedSquare + [Point(PosX, PosY)]
            rect = Rectangle(Point(PosX, PosY), Point(PosX + 100, PosY + 100))
            rect.setWidth(5)
            rect.draw(win)
        else:
            editSquare.undraw()
            break


win = GraphWin("GRID", 500, 500)
createGrid()
while True:
    editMode()

Как вы можете видеть, при нажатии, вокруг выделенного квадрата сетки будет более толстая граница, я хотел бы иметь возможность: 1) удалить утолщенную границу при повторном нажатии 2) иметь возможность удалить все утолщенные границы, окружающие квадраты сетки, но я просто не могу понять это, любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 05 января 2020

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

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

from graphics import *

GRID_SIZE = 5
SQUARE_SIZE = 100
EDIT_BUTTON_SIZE = 20
BORDER_WIDTH = 5

def createGrid():
    X, Y = 0, 0

    for _ in range(1, GRID_SIZE + 1):
        for _ in range(1, GRID_SIZE + 1):
            gridSquare = Rectangle(Point(X, Y), Point(X + SQUARE_SIZE, Y + SQUARE_SIZE))
            gridSquare.draw(win)
            X += SQUARE_SIZE

        Y += SQUARE_SIZE
        X = 0

def editMode():
    selectedSquares = []
    instruction = input("> ")

    if instruction == "s":
        selectionMode(selectedSquares)

def checkSelected(point, squares):
    for selected in squares:
        if point.getX() == selected.getX() and point.getY() == selected.getY():
            return selected

    return None

def selectionMode(selectedSquares):
    editSquare = Rectangle(Point(0, 0), Point(EDIT_BUTTON_SIZE, EDIT_BUTTON_SIZE))
    editSquare.setFill("black")
    editSquare.draw(win)

    while True:
        selection = win.getMouse()
        clickXPos = selection.getX()
        clickYPos = selection.getY()

        if clickXPos <= EDIT_BUTTON_SIZE and clickYPos <= EDIT_BUTTON_SIZE:
            break

        PosX, PosY = clickXPos - clickXPos % SQUARE_SIZE, clickYPos - clickYPos % SQUARE_SIZE
        point = Point(PosX, PosY)
        selected = checkSelected(point, selectedSquares)

        if selected:
            selected.rect.undraw()
            selectedSquares.remove(selected)
        else:
            rect = Rectangle(point, Point(PosX + SQUARE_SIZE, PosY + SQUARE_SIZE))
            rect.setWidth(BORDER_WIDTH)
            rect.draw(win)

            point.rect = rect

            selectedSquares.append(point)

    editSquare.undraw()

win = GraphWin("GRID", GRID_SIZE * SQUARE_SIZE, GRID_SIZE * SQUARE_SIZE)

createGrid()

while True:
    editMode()

Но это всего лишь пластырь - по мере того, как вы добавляете больше функциональных возможностей, проблема отсутствия структуры данных и прописанных логик c продолжит вас расстраивать.

...