我正在尝试使用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应用程序时的结果:
在后台运行一个不同的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
但这也没有帮助。我认为通过定义单例方法,我会删除缓存。
任何进一步的提示都会非常有用。
答案 0 :(得分:0)
我不认为你做错了什么。我认为你所看到的与图像缓存有关,而Shoes用于提高效率。如果十个窗口都使用相同的图像,则Shoes不会从每个窗口的磁盘中获取文件(或从Web下载文件)。相反,Shoes会缓存第一个窗口中使用的图像,当其他窗口使用相同的Image路径时,Shoes会从缓存中检索图像。因此,如果您的图片路径没有变化,那么看起来鞋子会使用缓存的图片。如果一个Image in Shoes有一个reload()方法会很好,这会迫使Shoes忽略缓存并再次获取图像。
在您的应用中,第一个按钮点击有效,因为图片的路径从"/desktop_pic"
更改为"/home/njutik/preview_desktop_pic"
。后续点击不会更改图像的路径。
答案 1 :(得分:0)
要更改图像,新图像的名称必须与前一个图像不同。我不知道为什么,但是那对我有用。