是否可以从循环中取消绘制先前绘制的形状?泽尔图形 Python

Is it possible to undraw a previously drawn shape from a loop? Zelle Graphics Python

我想知道是否可以从循环中取消绘制以前绘制的形状。我有这个功能,可以在单击时创建正方形,但是我想这样做,以便在第二次单击同一区域时,正方形将取消绘制。

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) 能够去除网格正方形周围的所有加厚边框 但我似乎无法弄清楚这一点,我们将不胜感激!

一般的问题似乎是您的程序没有底层数据结构或逻辑 -- 您首先绘制界面,然后尝试使其行为定义程序。

下面我已经修补了你的代码,让所选方块列表上的点记住绘制的矩形以突出显示它们,因此如果再次选择它们,可以撤消突出显示并删除点:

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

但这只是创可贴——随着您添加更多功能,缺乏数据结构和拼写逻辑的问题将继续困扰您。