Ruby:如何在图像更改后更新图像的路径?

时间:2017-02-19 12:45:50

标签: ruby image shoes

我正在尝试使用ruby Shoes构建一个GUI来为我的桌面选择背景图像。当我想到我的想法的一个特定部分时,我将描述问题部分,其余的工作正常。

这是我的ruby Shoes应用程序的代码:

Shoes.app :title => "Images!" do 
    stack do
        @img1 = image "desktop_pic", :width => 200, :height => 100
        button "Change image", :margin => 25 do
            @img1.path = "/home/njutik/preview_desktop_pic"
        end
    end
end

以下是我启动Shoes应用程序时的结果:

result_at_beginning

在后台运行一个不同的ruby脚本,生成一个新的背景图像并将其存储为preview_desktop_pic

因此,当我点击Change image - 按钮时,@img1的路径会被调整,我会看到新图片:

result_after_clicking_change_button

到目前为止这很好。我的问题是,当我再次点击Change image - 按钮 时,没有任何反应。当然,在此期间已有一个新图像preview_desktop_pic所以代码行

@img1.path = "/home/njutik/preview_destkop_pic"
每次按下Change image - 按钮时执行的

应该会显示一张新照片,但没有任何反应。即使我从文件夹中删除preview_desktop_pic,然后按下Change image - 按钮,仍然没有任何变化,我看到的只是点击Chage image - 按钮后显示的相同图片这是第一次。

所以我的问题是:我做错了什么?每次按下preview_desktop_pic按钮时,如何让Shoes应用显示当前Change image

任何提示都会非常棒!

更新:在7stud的评论之后,我尝试为按钮定义单例方法。像这样:

@change_image = button "Change image"

def @change_image.click 
  @img1.path = "/home/njutik/preview_login_background"
end

@change_image.click

但这没有帮助 - 没有任何改变。 然后我尝试了这个:

def @img1.reload
  @img1.path = "/home/njutik/preview_login_background"
end

button "Change image" do 
  @img1.reload
end

但这也没有帮助。我认为通过定义单例方法,我会删除缓存。

任何进一步的提示都会非常有用。

2 个答案:

答案 0 :(得分:0)

我不认为你做错了什么。我认为你所看到的与图像缓存有关,而Shoes用于提高效率。如果十个窗口都使用相同的图像,则Shoes不会从每个窗口的磁盘中获取文件(或从Web下载文件)。相反,Shoes会缓存第一个窗口中使用的图像,当其他窗口使用相同的Image路径时,Shoes会从缓存中检索图像。因此,如果您的图片路径没有变化,那么看起来鞋子会使用缓存的图片。如果一个Image in Shoes有一个reload()方法会很好,这会迫使Shoes忽略缓存并再次获取图像。

在您的应用中,第一个按钮点击有效,因为图片的路径从"/desktop_pic"更改为"/home/njutik/preview_desktop_pic"。后续点击不会更改图像的路径。

答案 1 :(得分:0)

要更改图像,新图像的名称必须与前一个图像不同。我不知道为什么,但是那对我有用。