简体   繁体   English

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

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

I was wondering if it was possible to undraw previously drawn shapes from a loop.我想知道是否可以从循环中取消绘制先前绘制的形状。 I have this function that'll create squares on click however I want to make it so that when the same area is clicked a second time the square will undraw.我有这个功能,可以在点击时创建方块,但是我想这样做,以便在第二次点击相同区域时,方块将展开。

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

As you can see, on click, there will be a thicker border around the grid square that was selected, I would like to be able to 1) remove the thickened border if clicked a second time 2) be able to remove all thickened borders surrounding grid squares but I just cannot seem to figure this out, any help would be greatly appreciated!如您所见,单击时,选定的网格方块周围将有一个较粗的边框,我希望能够 1) 如果第二次单击,则删除加厚的边框 2) 能够删除周围所有加厚的边框网格方块,但我似乎无法弄清楚这一点,任何帮助将不胜感激!

The general problem seems to be that you have no underlying data structure or logic for your program -- you're drawing the interface first and then trying to make its behaviors define the program.一般的问题似乎是您的程序没有底层数据结构或逻辑——您首先绘制界面,然后尝试使其行为定义程序。

Below I've patched your code to have the points on the selected squares list remember what rectangle was drawn to highlight them, so if they are selected again, the highlight can be undone and the point removed:下面我已经修补了您的代码,以使所选方块列表中的点记住绘制了哪个矩形来突出显示它们,因此如果再次选择它们,可以撤消突出显示并删除该点:

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

But this is only a band-aid -- as you add more functionality the issue of a lack of data structure and spelled out logic will continue to frustrate you.但这只是创可贴——随着您添加更多功能,缺乏数据结构和明确逻辑的问题将继续让您感到沮丧。

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

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