在PySimpleGUI中仅删除画布上的一个DrawImage需要帮助。画布加载了一个背景图像(画布的100%),并在其上有5个其他DrawImage项(大小不一)。当我点击这5张图片中的一张时,我希望它消失(删除),但背景图片留下来。
使用来自鼠标点击的坐标的get_figures_at_location来删除我想要消失的图像。但我的程序也删除了背景。
有什么想法吗?在搜索了许多论坛后,找不到这样做的方法。
发布于 2021-11-23 15:16:42
使用draw_image保存绘制背景图片时返回的id,通过id确认不是背景图片后删除。
draw = window['-GRAPH-']
bg_id = draw.draw_image(filename=filename)
...
figures = draw.get_figures_at_location((x, y))
if figures and figures[0] != bg_id:
draw.delete_figure(figures[-1]) # index -1 for last one or top one下面的代码显示了在鼠标点击图形后删除所有图形。(请记住将其替换为您的背景图像)
from io import BytesIO
from random import randint
from PIL import Image
import PySimpleGUI as sg
def image_to_data(im):
"""
Image object to bytes object.
: Parameters
im - Image object
: Return
bytes object.
"""
with BytesIO() as output:
im.save(output, format="PNG")
data = output.getvalue()
return data
width, height = size = (640, 480)
im = Image.open("D:/desktop.png")
new_im = im.resize(size)
font = ("Courier New", 11)
sg.theme("DarkBlue3")
sg.set_options(font=font)
layout = [
[sg.Button('Redraw')],
[sg.Graph(size, (0, 0), size, enable_events=True, key='-GRAPH-')],
]
window = sg.Window('Title', layout, finalize=True)
draw = window['-GRAPH-']
background = draw.draw_image(data=image_to_data(new_im), location=(0, height))
ids = [draw.draw_image(data=emoji, location=(randint(0, width), randint(0, height)))
for emoji in sg.EMOJI_BASE64_HAPPY_LIST]
print(ids)
while True:
event, values = window.read()
if event in (sg.WINDOW_CLOSED, 'Exit'):
break
elif event == '-GRAPH-':
location = values[event]
figures = draw.get_figures_at_location(location)
for figure in figures:
if figure != background:
draw.delete_figure(figure)
ids.remove(figure)
elif event == 'Redraw':
for figure in ids:
draw.delete_figure(figure)
ids = [draw.draw_image(data=emoji, location=(randint(0, width), randint(0, height)))
for emoji in sg.EMOJI_BASE64_HAPPY_LIST]
window.close()

https://stackoverflow.com/questions/70080233
复制相似问题