繁体   English   中英

是否可以从循环中取消绘制先前绘制的形状? Zelle 图形 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()

但这只是创可贴——随着您添加更多功能,缺乏数据结构和明确逻辑的问题将继续让您感到沮丧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM