首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DrawImage删除- PySimpleGUI

DrawImage删除- PySimpleGUI
EN

Stack Overflow用户
提问于 2021-11-23 11:39:34
回答 1查看 48关注 0票数 0

在PySimpleGUI中仅删除画布上的一个DrawImage需要帮助。画布加载了一个背景图像(画布的100%),并在其上有5个其他DrawImage项(大小不一)。当我点击这5张图片中的一张时,我希望它消失(删除),但背景图片留下来。

使用来自鼠标点击的坐标的get_figures_at_location来删除我想要消失的图像。但我的程序也删除了背景。

有什么想法吗?在搜索了许多论坛后,找不到这样做的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-23 15:16:42

使用draw_image保存绘制背景图片时返回的id,通过id确认不是背景图片后删除。

代码语言:javascript
复制
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

下面的代码显示了在鼠标点击图形后删除所有图形。(请记住将其替换为您的背景图像)

代码语言:javascript
复制
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()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70080233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档