【问题标题】:DrawImage delete - PySimpleGUIDrawImage 删除 - PySimpleGUI
【发布时间】:2021-11-23 11:39:33
【问题描述】:

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

使用 get_figures_at_location 和从鼠标单击获得的坐标来删除我想要离开的一个图像。但是我的例程也会删除背景。

有什么想法吗?搜索了许多论坛后找不到方法。

【问题讨论】:

    标签: drawimage pysimplegui


    【解决方案1】:

    保存使用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()
    

    【讨论】:

    • 完美@jason-yang。能够从您的代码中获取 sn-ps 并将其用于我的解决方案:-)
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2019-06-23
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多