找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 237|回复: 6

[已解决] 获取Gallery中名为name的button所对应的images

[复制链接]
发表于 2026-1-20 02:56:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 Aaron栩生阿龙 于 2026-1-25 20:17 编辑

我们亲爱的烈烈曾经说过:
我说gallery是renpy的屎山代码,有没有懂的)

他说的对。


---分割线---


不过我的问题是:如何优雅地获取Gallery中名为name的button所对应的images?
目前倒是有方法获取,但是不太美观,我在浏览了10086遍00gallery.rpy文件后还没发现比较好的方法,所以来这里问一下,如果没有其他解决方式的话我就把这篇帖子改成经验教程吧(
先贴上代码吧

[RenPy] 纯文本查看 复制代码
Gallery().buttons[name].images[0].displayables[0]

然后我们来说一下具体原理
查阅源文件我们可以得知,Gallery对象有一个名为buttons的字典,其中键是button的name,值是button本身(原文为A map from button name (or image) to __GalleryButton object.)
这个button呢又是一个__GalleryButton对象,
[Python] 纯文本查看 复制代码
class __GalleryButton(object):
    def __init__(self, gallery, index):
        self.gallery = gallery
        self.images = [ ] # 没错就是这个东西
        self.conditions = [ ]
        self.index = index

它有一个名为images的属性,是一个列表,其中的元素是该button对应的image
但是——这里的image不是一个可视组件,它是一个__GalleryImage对象,
[Python] 纯文本查看 复制代码
class __GalleryImage(object):
    show_properties = None
    def __init__(self, gallery, displayables, **properties):
        self.gallery = gallery
        self.conditions = [ ]
        self.displayables = displayables # 没错是这个东西
        self.transforms = [ None ] * len(displayables)
        self.show_properties, = renpy.split_properties(properties, "show_")

这个对象有一个名为displayables的属性,是一个元组,其中的元素就是可视组件了,于是我们终于获得到了这个可视组件
所以上面的代码获取的是名为name的button所对应的第一个image,如果需要获得全部的image需要循环images列表,并且循环出来之后还要循环displayables这个元组,最终获得的元素才是可视组件本身


所以,真的没有优雅一点的方法吗,虽然确实可以自己写一个函数循环就是了


发表于 2026-1-20 11:30:41 | 显示全部楼层
补充一些楼主没有考虑到的角度……

按照楼主说的,“自己写一个函数循环”可能会遇到一个问题:需要去重。即一个 __GalleryButton 对象中的 __GalleryImage 列表包含的displayable是存在重复的可能性的。
__GalleryImage 类中的displayables设计为一个displayable列表,允许构造时一次传入多个displayable,比如“角色各个组件+背景”的组合方式。以文档为例:
[RenPy] 纯文本查看 复制代码
    # The final two buttons contain images that show multiple pictures
    # at the same time. This can be used to compose character art onto
    # a background.
    g.button("dawn mary")
    g.unlock_image("dawn1", "mary dawn wistful")
    g.unlock_image("dawn1", "mary dawn smiling")
    g.unlock_image("dawn1", "mary dawn vhappy")

其中的“dawn1”是背景图。如果想要获取“dawn mary”按钮所对应的images,楼主希望得到的结果是几张图呢?
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2026-1-20 16:30:16 | 显示全部楼层
被诅咒的章鱼 发表于 2026-1-20 11:30
补充一些楼主没有考虑到的角度……

按照楼主说的,“自己写一个函数循环”可能会遇到一个问题:需要去重。 ...

确实存在这种情况……不过也有解决方法,传入的多个可视组件本身就是同时显示的,所以通用的方式应该是把displayables里的元素整合到一个Fixed组件里,这样传入的内容和获取的内容就是一样的了

除非用户不想这么干,但是一般来说不会有这种情况吧,我研究这个也是因为想把button的unlocked时的可视组件自动应用成这个button对应的第一个image
回复 支持 抱歉

使用道具 举报

发表于 2026-1-20 20:51:47 | 显示全部楼层
gallery就是renpy的屎山代码!
去质问tom下个renpy版本能不能再优化一下gallery,再多整点接口,再把文档里的gallery部分写的更简洁易懂一些
希望有生之年能盼到gallery的优化版本)
回复 支持 抱歉

使用道具 举报

发表于 2026-1-21 11:13:21 | 显示全部楼层
Aaron栩生阿龙 发表于 2026-1-20 16:30
确实存在这种情况……不过也有解决方法,传入的多个可视组件本身就是同时显示的,所以通用的方式应该是把 ...

测试了一下,使用默认的 Gallery 对象,在一个按钮上添加多个图片后,只要有其中一张图片解锁,按钮就会使用第一个image作为自身显示内容,即使第一张图片实际未满足解锁条件。
当然,点击进去后,第一张图片还是会提示未解锁,默认的 gallery_navigation 界面无法查看对应图片。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2026-1-21 19:05:26 | 显示全部楼层
被诅咒的章鱼 发表于 2026-1-21 11:13
测试了一下,使用默认的 Gallery 对象,在一个按钮上添加多个图片后,只要有其中一张图片解锁,按钮就会 ...

大概是Gallery自己的bug,不过我是自己写的button,可以通过自定义sensitive避免这种情况(
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2026-1-21 19:06:50 | 显示全部楼层
烈林凤 发表于 2026-1-20 20:51
gallery就是renpy的屎山代码!
去质问tom下个renpy版本能不能再优化一下gallery,再多整点接口,再把文档里 ...

速速去提一个issue(
回复 支持 抱歉

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2026-3-8 11:12 , Processed in 0.046959 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表