【问题标题】:Dynamic PySimpleGUI Button (Python)动态 PySimpleGUI 按钮 (Python)
【发布时间】:2021-05-11 17:09:04
【问题描述】:

假设我有一个显示一个单词的按钮,当我单击它时,我希望它显示一个图像,我这样做是这样的:

x,y=event
window_play.FindElement(event).Update(image_filename=(imgs_path + os.sep + "Back.png"))

它按预期工作。但我正在努力的是在第二次点击后回到原来的视图。我考虑过制作这个按钮的副本(它实际上是一个按钮矩阵(这就是为什么 X 和 Y,但让我们专注于一个))并将状态保持在一个布尔值(布尔值矩阵)中,这可能会也可能不会工作,但这不是错误本身。问题是,我不知道该怎么做,是否更新整个按钮,或者只是文本,或者..什么(当真/假时)。 我曾考虑过使用元素可见性,但不完全确定如何。

提前感谢您的任何提示。

【问题讨论】:

    标签: python image button text pysimplegui


    【解决方案1】:

    如果没有图像,最好创建一个用于按钮的空白图像。

    给你的演示代码,这里没有图像文件,所以使用来自 PySimpleGUI 的内部 base64 编码图像并通过 Pillow/PIL 创建一个相同大小的空白图像。

    import base64
    from io import BytesIO
    
    from PIL import Image
    import PySimpleGUI as sg
    
    sg.theme("DarkBlue3")
    sg.set_options(font=("Courier New", 16))
    
    # Get size of image `sg.EMOJI_BASE64_HAPPY_BIG_SMILE`
    buffer = BytesIO(base64.b64decode(sg.EMOJI_BASE64_HAPPY_BIG_SMILE))
    im1 = Image.open(buffer)
    width, height = im1.size
    
    # Create a blank image
    im2 = Image.new("RGBA", (width, height), "#ffffff00")
    with BytesIO() as output:
        im2.save(output, format="PNG")
        blank = output.getvalue()
    
    # Image state of button saved in `element.metadata`
    layout = [[sg.Button("", image_data=blank, key=(j, i), metadata=False) for i in range(3)] for j in range(3)]
    window = sg.Window("Title", layout, finalize=True)
    
    while True:
        event, values = window.read()
        if event in (sg.WINDOW_CLOSED, "Exit"):
            break
        elif type(event) == tuple:
            element = window[event]
            if element.metadata:
                element.update(image_data=blank)
            else:
                element.update(image_data=sg.EMOJI_BASE64_HAPPY_BIG_SMILE)
            element.metadata = not element.metadata
    
    window.close()
    

    【讨论】:

    • 运行此程序时出现两个错误,找不到“BytesIO”(我通过从“io”导入它来修复,我不知道,但查了一下),并且“base64”也给我带来了一些麻烦。但这确实是个好主意,我需要试试这段代码。
    • 好的,我不能重新编辑它,但我让它工作了。这正是我们所需要的,这将帮助我继续前进,非常感谢!
    猜你喜欢
    • 2022-10-16
    • 2021-03-18
    • 2020-12-09
    • 2019-07-04
    • 2018-12-06
    • 1970-01-01
    • 2015-07-27
    • 2022-01-21
    • 2019-08-12
    相关资源
    最近更新 更多