2017-02-19 1 views
1

Ich versuche eine GUI mit Ruby Shoes zu erstellen, um ein Hintergrundbild für meinen Desktop auszuwählen. Während ich mit einem bestimmten Teil meiner Idee streite, werde ich nur den Problemteil beschreiben, der Rest funktioniert gut.Ruby: Wie man den Pfad eines Bildes erneuert, nachdem das Bild geändert wurde?

Hier ist der Code meines Rubin Schuhe App:

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 

Hier ist, was das Ergebnis aussieht, wenn ich meine Schuhe app starten:

result_at_beginning

Im Hintergrund eine andere Rubin Skript läuft, das ein neues Hintergrundbild erzeugt und es als preview_desktop_pic speichert.

Also, wenn ich die Change image -Schaltfläche klicken, wird der Pfad von @img1 eingestellt, und ich sehe das neue Bild:

result_after_clicking_change_button

, die so weit in Ordnung. Mein Problem ist, dass nichts passiert, wenn ich auf Change image -button wieder klicke. Natürlich in der Zwischenzeit gibt es bereits ein neues Bild preview_desktop_pic so

@img1.path = "/home/njutik/preview_destkop_pic" 

die Codezeile, die jedes Mal, wenn ich die Change image -Schaltfläche drücken ausgeführt wird, sollte mir ein neues Bild zeigen, aber nichts passiert. Auch wenn ich die preview_desktop_pic aus dem Ordner lösche und dann die Change image -Schaltfläche drücke, gibt es immer noch keine Änderung und alles, was ich sehe, ist das gleiche Bild, das nach dem ersten Klick auf den Chage image -Button angezeigt wird.

Also meine Frage ist: Was mache ich falsch und wie kann ich die Shoes App zeigen die aktuelle preview_desktop_pic jedes Mal, wenn ich die Change image -Taste drücken?

Alle Hinweise wären wirklich toll!

Update: Nach dem Kommentar von 7stud habe ich versucht, eine Singleton-Methode für die Schaltfläche zu definieren. Gefällt mir:

Aber das hat nicht geholfen - nichts hat sich geändert. Dann habe ich versucht, dies:

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

button "Change image" do 
    @img1.reload 
end 

Aber dies auch nicht helfen. Ich dachte, dass ich mit dem Definieren von Singleton-Methoden den Cache-Speicher löschen würde.

Weitere Hinweise wären sehr hilfreich.

Antwort

0

Ich glaube nicht, dass Sie etwas falsch machen. Ich denke, dass das, was Sie sehen, mit dem Image-Caching zu tun hat, das Shoes für Effizienz verwendet. Wenn zehn Fenster alle dasselbe Bild verwenden, ruft Shoes die Datei nicht für jedes Fenster von der Festplatte ab (oder lädt die Datei aus dem Internet herunter). Stattdessen speichert Shoes das im ersten Fenster verwendete Bild, und wenn die anderen Fenster den gleichen Pfad für das Bild verwenden, ruft Shoes das Bild aus dem Cache ab. Wenn sich der Pfad für Ihr Bild nicht ändert, sieht das so aus, als ob Shoes das zwischengespeicherte Bild verwendet. Es wäre schön, wenn ein Image in Shoes eine reload() -Methode hätte, die Shoes zwingen würde, den Cache zu ignorieren und das Bild erneut zu bekommen.

In Ihrer App funktioniert der erste Schaltflächenklick, da sich der Pfad des Bilds von "/desktop_pic" zu "/home/njutik/preview_desktop_pic" ändert. Nachfolgende Klicks ändern den Pfad des Bilds nicht.

+0

Vielen Dank! Gibt es eine Möglichkeit, den Cache jedes Mal zu löschen, wenn ich auf "Bild ändern" klicke? – Njutik

Verwandte Themen